Version 1.5.0-dev.4.4

Reverting bleeding edge revisions 37107 and r37101 from trunk
svn merge -r37107:37106 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -r37101:37100 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@37111 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/lib/compiler/implementation/lib/web.dart b/lib/compiler/implementation/lib/web.dart
new file mode 100644
index 0000000..a75db7b
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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("web");
+
+String htmlEscape(String text) {
+  throw "Unimplemented: web::htmlEscape(String).";
+}
diff --git a/lib/compiler/implementation/lib/web.dartp b/lib/compiler/implementation/lib/web.dartp
new file mode 100644
index 0000000..c3ba2ad
--- /dev/null
+++ b/lib/compiler/implementation/lib/web.dartp
@@ -0,0 +1,13 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 file for dart:web
+
+/*patch*/ String htmlEscape(String text) {
+  return text.replaceAll("&", "&")
+             .replaceAll("<", "&lt;")
+             .replaceAll(">", "&gt;")
+             .replaceAll('"', "&quot;")
+             .replaceAll("'", "&apos;");  // Different from original.
+}
diff --git a/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/dartium/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..1b4a00d
--- /dev/null
+++ b/lib/dom/templates/html/dartium/impl_EventTarget.darttemplate
@@ -0,0 +1,106 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 _EventsImpl implements Events {
+  // TODO(podivilov): add type.
+  final _ptr;
+
+  final Map<String, EventListenerList> _listenerMap;
+
+  _EventsImpl(this._ptr) : _listenerMap = <EventListenerList>{};
+
+  EventListenerList operator [](String type) {
+    return _listenerMap.putIfAbsent(type,
+      () => new _EventListenerListImpl(_ptr, type));
+  }
+}
+
+class _EventListenerWrapper {
+  final EventListener raw;
+  final Function wrapped;
+  final bool useCapture;
+  _EventListenerWrapper(this.raw, this.wrapped, this.useCapture);
+}
+
+class _EventListenerListImpl implements EventListenerList {
+  // TODO(podivilov): add type.
+  final _ptr;
+  final String _type;
+  List<_EventListenerWrapper> _wrappers;
+
+  _EventListenerListImpl(this._ptr, this._type) :
+    // TODO(jacobr): switch to <_EventListenerWrapper>[] when the VM allow it.
+    _wrappers = new List<_EventListenerWrapper>();
+
+  EventListenerList add(EventListener listener, [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  EventListenerList remove(EventListener listener, [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    // TODO(jacobr): what is the correct behavior here. We could alternately
+    // force the event to have the expected type.
+    assert(evt.type == _type);
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type,
+                          _findOrAddWrapper(listener, useCapture),
+                          useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    Function wrapper = _removeWrapper(listener, useCapture);
+    if (wrapper !== null) {
+      _ptr.$dom_removeEventListener(_type, wrapper, useCapture);
+    }
+  }
+
+  Function _removeWrapper(EventListener listener, bool useCapture) {
+    if (_wrappers === null) {
+      return null;
+    }
+    for (int i = 0; i < _wrappers.length; i++) {
+      _EventListenerWrapper wrapper = _wrappers[i];
+      if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+        // Order doesn't matter so we swap with the last element instead of
+        // performing a more expensive remove from the middle of the list.
+        if (i + 1 != _wrappers.length) {
+          _wrappers[i] = _wrappers.removeLast();
+        } else {
+          _wrappers.removeLast();
+        }
+        return wrapper.wrapped;
+      }
+    }
+    return null;
+  }
+
+  Function _findOrAddWrapper(EventListener listener, bool useCapture) {
+    if (_wrappers === null) {
+      _wrappers = <_EventListenerWrapper>[];
+    } else {
+      for (_EventListenerWrapper wrapper in _wrappers) {
+        if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
+          return wrapper.wrapped;
+        }
+      }
+    }
+    final wrapped = (e) { listener(e); };
+    _wrappers.add(new _EventListenerWrapper(listener, wrapped, useCapture));
+    return wrapped;
+  }
+}
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+/*
+$!MEMBERS
+*/
+}
diff --git a/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
new file mode 100644
index 0000000..8fe27e5
--- /dev/null
+++ b/lib/dom/templates/html/frog/factoryprovider__Elements.darttemplate
@@ -0,0 +1,7 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 _Elements {
+
+$!FACTORY_METHODS}
diff --git a/lib/dom/templates/html/frog/impl_EventTarget.darttemplate b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
new file mode 100644
index 0000000..893f3d2
--- /dev/null
+++ b/lib/dom/templates/html/frog/impl_EventTarget.darttemplate
@@ -0,0 +1,61 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 _EventsImpl implements Events {
+  /* Raw event target. */
+  // TODO(jacobr): it would be nice if we could specify this as
+  // _EventTargetImpl or EventTarget
+  final Dynamic _ptr;
+
+  _EventsImpl(this._ptr);
+
+  _EventListenerListImpl operator [](String type) {
+    return new _EventListenerListImpl(_ptr, type);
+  }
+}
+
+class _EventListenerListImpl implements EventListenerList {
+  
+  // TODO(jacobr): make this _EventTargetImpl
+  final Dynamic _ptr;
+  final String _type;
+
+  _EventListenerListImpl(this._ptr, this._type);
+
+  // TODO(jacobr): implement equals.
+
+  _EventListenerListImpl add(EventListener listener,
+      [bool useCapture = false]) {
+    _add(listener, useCapture);
+    return this;
+  }
+
+  _EventListenerListImpl remove(EventListener listener,
+      [bool useCapture = false]) {
+    _remove(listener, useCapture);
+    return this;
+  }
+
+  bool dispatch(Event evt) {
+    // TODO(jacobr): what is the correct behavior here. We could alternately
+    // force the event to have the expected type.
+    assert(evt.type == _type);
+    return _ptr.$dom_dispatchEvent(evt);
+  }
+
+  void _add(EventListener listener, bool useCapture) {
+    _ptr.$dom_addEventListener(_type, listener, useCapture);
+  }
+
+  void _remove(EventListener listener, bool useCapture) {
+    _ptr.$dom_removeEventListener(_type, listener, useCapture);
+  }
+}
+
+
+class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
+
+  Events get on() => new _EventsImpl(this);
+$!MEMBERS
+}
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index f39ba53..db5be05 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -5,7 +5,6 @@
 library analysis.server;
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
@@ -39,7 +38,6 @@
   AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider resourceProvider)
       : super(resourceProvider);
 
-  @override
   void addContext(Folder folder, File pubspecFile) {
     ContextDirectory contextDirectory = new ContextDirectory(
         analysisServer.defaultSdk, folder, pubspecFile);
@@ -47,15 +45,9 @@
     analysisServer.schedulePerformAnalysisOperation(contextDirectory.context);
   }
 
-  @override
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
     analysisServer.folderMap[contextFolder].context.applyChanges(changeSet);
   }
-
-  @override
-  void removeContext(Folder folder) {
-    analysisServer.folderMap.remove(folder);
-  }
 }
 
 /**
@@ -96,8 +88,7 @@
   /**
    * A table mapping [Folder]s to the [ContextDirectory]s associated with them.
    */
-  final Map<Folder, ContextDirectory> folderMap =
-      new HashMap<Folder, ContextDirectory>();
+  final Map<Folder, ContextDirectory> folderMap = <Folder, ContextDirectory>{};
 
   /**
    * A queue of the operations to perform in this server.
@@ -111,14 +102,13 @@
   /**
    * A set of the [ServerService]s to send notifications for.
    */
-  Set<ServerService> serverServices = new HashSet<ServerService>();
+  Set<ServerService> serverServices = new Set<ServerService>();
 
   /**
    * A table mapping [AnalysisService]s to the file paths for which these
    * notifications should be sent.
    */
-  Map<AnalysisService, Set<String>> analysisServices =
-      new HashMap<AnalysisService, Set<String>>();
+  Map<AnalysisService, Set<String>> analysisServices = <AnalysisService, Set<String>>{};
 
   /**
    * True if any exceptions thrown by analysis should be propagated up the call
@@ -260,6 +250,10 @@
    * 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);
     Map<String, Object> analysis = new Map();
     if (contextId != null) {
@@ -331,27 +325,12 @@
           List<AnalysisError> errors = analysisContext.getErrors(source).errors;
           sendAnalysisNotificationErrors(this, file, errors);
         }
-        // TODO(scheglov)
-        // 1. implement resolveCompilationUnit()
-        // 2. Share "if (dartUnit != null)"
         if (service == AnalysisService.HIGHLIGHTS) {
           CompilationUnit dartUnit = test_getResolvedCompilationUnit(file);
           if (dartUnit != null) {
             sendAnalysisNotificationHighlights(this, file, dartUnit);
           }
         }
-        if (service == AnalysisService.NAVIGATION) {
-          CompilationUnit dartUnit = test_getResolvedCompilationUnit(file);
-          if (dartUnit != null) {
-            sendAnalysisNotificationNavigation(this, file, dartUnit);
-          }
-        }
-        if (service == AnalysisService.OUTLINE) {
-          CompilationUnit dartUnit = test_getResolvedCompilationUnit(file);
-          if (dartUnit != null) {
-            sendAnalysisNotificationOutline(this, file, dartUnit);
-          }
-        }
       }
     });
     // remember new subscriptions
diff --git a/pkg/analysis_server/lib/src/computers.dart b/pkg/analysis_server/lib/src/computers.dart
new file mode 100644
index 0000000..6b954dc
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computers.dart
@@ -0,0 +1,712 @@
+// 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 computers;
+
+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';
+
+
+/**
+ * A computer for [HighlightRegion]s in a Dart [CompilationUnit].
+ */
+class DartUnitHighlightsComputer {
+  final CompilationUnit _unit;
+
+  final List<Map<String, Object>> _regions = <Map<String, Object>>[];
+
+  DartUnitHighlightsComputer(this._unit);
+
+  /**
+   * Returns the computed highlight regions, not `null`.
+   */
+  List<Map<String, Object>> compute() {
+    _unit.accept(new _DartUnitHighlightsComputerVisitor(this));
+    return _regions;
+  }
+
+  void _addIdentifierRegion(SimpleIdentifier node) {
+    if (_addIdentifierRegion_keyword(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_class(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_constructor(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_dynamicType(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_getterSetterDeclaration(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_field(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_function(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_functionTypeAlias(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_importPrefix(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_localVariable(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_method(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_parameter(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_topLevelVariable(node)) {
+      return;
+    }
+    if (_addIdentifierRegion_typeParameter(node)) {
+      return;
+    }
+    _addRegion_node(node, HighlightType.IDENTIFIER_DEFAULT);
+  }
+
+  void _addIdentifierRegion_annotation(Annotation node) {
+    ArgumentList arguments = node.arguments;
+    if (arguments == null) {
+      _addRegion_node(node, HighlightType.ANNOTATION);
+    } else {
+      _addRegion_nodeStart_tokenEnd(node, arguments.beginToken, HighlightType.ANNOTATION);
+      _addRegion_token(arguments.endToken, HighlightType.ANNOTATION);
+    }
+  }
+
+  bool _addIdentifierRegion_class(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! ClassElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.CLASS);
+  }
+
+  bool _addIdentifierRegion_constructor(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! ConstructorElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.CONSTRUCTOR);
+  }
+
+  bool _addIdentifierRegion_dynamicType(SimpleIdentifier node) {
+    // should be variable
+    Element element = node.staticElement;
+    if (element is! VariableElement) {
+      return false;
+    }
+    // has propagated type
+    if (node.propagatedType != null) {
+      return false;
+    }
+    // has dynamic static type
+    DartType staticType = node.staticType;
+    if (staticType == null || !staticType.isDynamic) {
+      return false;
+    }
+    // OK
+    return _addRegion_node(node, HighlightType.DYNAMIC_TYPE);
+  }
+
+  bool _addIdentifierRegion_field(SimpleIdentifier node) {
+    Element element = node.bestElement;
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+    if (element is FieldElement) {
+      if ((element as FieldElement).isStatic) {
+        return _addRegion_node(node, HighlightType.FIELD_STATIC);
+      } else {
+        return _addRegion_node(node, HighlightType.FIELD);
+      }
+    }
+    if (element is PropertyAccessorElement) {
+      if ((element as PropertyAccessorElement).isStatic) {
+        return _addRegion_node(node, HighlightType.FIELD_STATIC);
+      } else {
+        return _addRegion_node(node, HighlightType.FIELD);
+      }
+    }
+    return false;
+  }
+
+  bool _addIdentifierRegion_function(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! FunctionElement) {
+      return false;
+    }
+    HighlightType type;
+    if (node.inDeclarationContext()) {
+      type = HighlightType.FUNCTION_DECLARATION;
+    } else {
+      type = HighlightType.FUNCTION;
+    }
+    return _addRegion_node(node, type);
+  }
+
+  bool _addIdentifierRegion_functionTypeAlias(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! FunctionTypeAliasElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.FUNCTION_TYPE_ALIAS);
+  }
+
+  bool _addIdentifierRegion_getterSetterDeclaration(SimpleIdentifier node) {
+    // should be declaration
+    AstNode parent = node.parent;
+    if (!(parent is MethodDeclaration || parent is FunctionDeclaration)) {
+      return false;
+    }
+    // should be property accessor
+    Element element = node.staticElement;
+    if (element is! PropertyAccessorElement) {
+      return false;
+    }
+    // getter or setter
+    PropertyAccessorElement propertyAccessorElement = element as PropertyAccessorElement;
+    if (propertyAccessorElement.isGetter) {
+      return _addRegion_node(node, HighlightType.GETTER_DECLARATION);
+    } else {
+      return _addRegion_node(node, HighlightType.SETTER_DECLARATION);
+    }
+  }
+
+  bool _addIdentifierRegion_importPrefix(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! PrefixElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.IMPORT_PREFIX);
+  }
+
+  bool _addIdentifierRegion_keyword(SimpleIdentifier node) {
+    String name = node.name;
+    if (name == "void") {
+      return _addRegion_node(node, HighlightType.KEYWORD);
+    }
+    return false;
+  }
+
+  bool _addIdentifierRegion_localVariable(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! LocalVariableElement) {
+      return false;
+    }
+    // OK
+    HighlightType type;
+    if (node.inDeclarationContext()) {
+      type = HighlightType.LOCAL_VARIABLE_DECLARATION;
+    } else {
+      type = HighlightType.LOCAL_VARIABLE;
+    }
+    return _addRegion_node(node, type);
+  }
+
+  bool _addIdentifierRegion_method(SimpleIdentifier node) {
+    Element element = node.bestElement;
+    if (element is! MethodElement) {
+      return false;
+    }
+    MethodElement methodElement = element as MethodElement;
+    bool isStatic = methodElement.isStatic;
+    // OK
+    HighlightType type;
+    if (node.inDeclarationContext()) {
+      if (isStatic) {
+        type = HighlightType.METHOD_DECLARATION_STATIC;
+      } else {
+        type = HighlightType.METHOD_DECLARATION;
+      }
+    } else {
+      if (isStatic) {
+        type = HighlightType.METHOD_STATIC;
+      } else {
+        type = HighlightType.METHOD;
+      }
+    }
+    return _addRegion_node(node, type);
+  }
+
+  bool _addIdentifierRegion_parameter(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! ParameterElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.PARAMETER);
+  }
+
+  bool _addIdentifierRegion_topLevelVariable(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! TopLevelVariableElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.TOP_LEVEL_VARIABLE);
+  }
+
+  bool _addIdentifierRegion_typeParameter(SimpleIdentifier node) {
+    Element element = node.staticElement;
+    if (element is! TypeParameterElement) {
+      return false;
+    }
+    return _addRegion_node(node, HighlightType.TYPE_PARAMETER);
+  }
+
+  void _addRegion(int offset, int length, HighlightType type) {
+    _regions.add({'offset': offset, 'length': length, 'type': type.name});
+  }
+
+  bool _addRegion_node(AstNode node, HighlightType type) {
+    int offset = node.offset;
+    int length = node.length;
+    _addRegion(offset, length, type);
+    return true;
+  }
+
+  void _addRegion_nodeStart_tokenEnd(AstNode a, Token b, HighlightType type) {
+    int offset = a.offset;
+    int end = b.end;
+    _addRegion(offset, end - offset, type);
+  }
+
+  void _addRegion_token(Token token, HighlightType type) {
+    if (token != null) {
+      int offset = token.offset;
+      int length = token.length;
+      _addRegion(offset, length, type);
+    }
+  }
+
+  void _addRegion_tokenStart_tokenEnd(Token a, Token b, HighlightType type) {
+    int offset = a.offset;
+    int end = b.end;
+    _addRegion(offset, end - offset, type);
+  }
+}
+
+
+/**
+ * An AST visitor for [DartUnitHighlightsComputer].
+ */
+class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<Object> {
+  final DartUnitHighlightsComputer computer;
+
+  _DartUnitHighlightsComputerVisitor(this.computer);
+
+  @override
+  Object visitAnnotation(Annotation node) {
+    computer._addIdentifierRegion_annotation(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
+  Object visitAsExpression(AsExpression node) {
+    computer._addRegion_token(node.asOperator, HighlightType.BUILT_IN);
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  Object visitBooleanLiteral(BooleanLiteral node) {
+    computer._addRegion_node(node, HighlightType.LITERAL_BOOLEAN);
+    return super.visitBooleanLiteral(node);
+  }
+
+  @override
+  Object visitCatchClause(CatchClause node) {
+    computer._addRegion_token(node.onKeyword, HighlightType.BUILT_IN);
+    return super.visitCatchClause(node);
+  }
+
+  @override
+  Object visitClassDeclaration(ClassDeclaration node) {
+    computer._addRegion_token(node.abstractKeyword, HighlightType.BUILT_IN);
+    return super.visitClassDeclaration(node);
+  }
+
+  @override
+  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.factoryKeyword, HighlightType.BUILT_IN);
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  Object visitDoubleLiteral(DoubleLiteral node) {
+    computer._addRegion_node(node, HighlightType.LITERAL_DOUBLE);
+    return super.visitDoubleLiteral(node);
+  }
+
+  @override
+  Object visitExportDirective(ExportDirective node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  Object visitFieldDeclaration(FieldDeclaration node) {
+    computer._addRegion_token(node.staticKeyword, HighlightType.BUILT_IN);
+    return super.visitFieldDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionDeclaration(FunctionDeclaration node) {
+    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    return super.visitFunctionDeclaration(node);
+  }
+
+  @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitFunctionTypeAlias(node);
+  }
+
+  @override
+  Object visitHideCombinator(HideCombinator node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitHideCombinator(node);
+  }
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitImplementsClause(node);
+  }
+
+  @override
+  Object visitImportDirective(ImportDirective node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.deferredToken, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.asToken, HighlightType.BUILT_IN);
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  Object visitIntegerLiteral(IntegerLiteral node) {
+    computer._addRegion_node(node, HighlightType.LITERAL_INTEGER);
+    return super.visitIntegerLiteral(node);
+  }
+
+  @override
+  Object visitLibraryDirective(LibraryDirective node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitLibraryDirective(node);
+  }
+
+  @override
+  Object visitMethodDeclaration(MethodDeclaration node) {
+    computer._addRegion_token(node.externalKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.modifierKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.operatorKeyword, HighlightType.BUILT_IN);
+    computer._addRegion_token(node.propertyKeyword, HighlightType.BUILT_IN);
+    return super.visitMethodDeclaration(node);
+  }
+
+  @override
+  Object visitNativeClause(NativeClause node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitNativeClause(node);
+  }
+
+  @override
+  Object visitNativeFunctionBody(NativeFunctionBody node) {
+    computer._addRegion_token(node.nativeToken, HighlightType.BUILT_IN);
+    return super.visitNativeFunctionBody(node);
+  }
+
+  @override
+  Object visitPartDirective(PartDirective node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitPartDirective(node);
+  }
+
+  @override
+  Object visitPartOfDirective(PartOfDirective node) {
+    computer._addRegion_tokenStart_tokenEnd(node.partToken, node.ofToken, HighlightType.BUILT_IN);
+    return super.visitPartOfDirective(node);
+  }
+
+  @override
+  Object visitShowCombinator(ShowCombinator node) {
+    computer._addRegion_token(node.keyword, HighlightType.BUILT_IN);
+    return super.visitShowCombinator(node);
+  }
+
+  @override
+  Object visitSimpleIdentifier(SimpleIdentifier node) {
+    computer._addIdentifierRegion(node);
+    return super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+    computer._addRegion_node(node, HighlightType.LITERAL_STRING);
+    return super.visitSimpleStringLiteral(node);
+  }
+
+  @override
+  Object visitTypeName(TypeName node) {
+    DartType type = node.type;
+    if (type != null) {
+      if (type.isDynamic && node.name.name == "dynamic") {
+        computer._addRegion_node(node, HighlightType.TYPE_NAME_DYNAMIC);
+        return null;
+      }
+    }
+    return super.visitTypeName(node);
+  }
+}
+
+
+/**
+ * Highlighting kinds constants.
+ */
+class HighlightType {
+  static const HighlightType ANNOTATION = const HighlightType('ANNOTATION');
+  static const HighlightType BUILT_IN = const HighlightType('BUILT_IN');
+  static const HighlightType CLASS = const HighlightType('CLASS');
+  static const HighlightType COMMENT_BLOCK = const HighlightType('COMMENT_BLOCK');
+  static const HighlightType COMMENT_DOCUMENTATION = const HighlightType('COMMENT_DOCUMENTATION');
+  static const HighlightType COMMENT_END_OF_LINE = const HighlightType('COMMENT_END_OF_LINE');
+  static const HighlightType CONSTRUCTOR = const HighlightType('CONSTRUCTOR');
+  static const HighlightType DIRECTIVE = const HighlightType('DIRECTIVE');
+  static const HighlightType DYNAMIC_TYPE = const HighlightType('DYNAMIC_TYPE');
+  static const HighlightType FIELD = const HighlightType('FIELD');
+  static const HighlightType FIELD_STATIC = const HighlightType('FIELD_STATIC');
+  static const HighlightType FUNCTION_DECLARATION = const HighlightType('FUNCTION_DECLARATION');
+  static const HighlightType FUNCTION = const HighlightType('FUNCTION');
+  static const HighlightType FUNCTION_TYPE_ALIAS = const HighlightType('FUNCTION_TYPE_ALIAS');
+  static const HighlightType GETTER_DECLARATION = const HighlightType('GETTER_DECLARATION');
+  static const HighlightType KEYWORD = const HighlightType('KEYWORD');
+  static const HighlightType IDENTIFIER_DEFAULT = const HighlightType('IDENTIFIER_DEFAULT');
+  static const HighlightType IMPORT_PREFIX = const HighlightType('IMPORT_PREFIX');
+  static const HighlightType LITERAL_BOOLEAN = const HighlightType('LITERAL_BOOLEAN');
+  static const HighlightType LITERAL_DOUBLE = const HighlightType('LITERAL_DOUBLE');
+  static const HighlightType LITERAL_INTEGER = const HighlightType('LITERAL_INTEGER');
+  static const HighlightType LITERAL_LIST = const HighlightType('LITERAL_LIST');
+  static const HighlightType LITERAL_MAP = const HighlightType('LITERAL_MAP');
+  static const HighlightType LITERAL_STRING = const HighlightType('LITERAL_STRING');
+  static const HighlightType LOCAL_VARIABLE_DECLARATION = const HighlightType('LOCAL_VARIABLE_DECLARATION');
+  static const HighlightType LOCAL_VARIABLE = const HighlightType('LOCAL_VARIABLE');
+  static const HighlightType METHOD_DECLARATION = const HighlightType('METHOD_DECLARATION');
+  static const HighlightType METHOD_DECLARATION_STATIC = const HighlightType('METHOD_DECLARATION_STATIC');
+  static const HighlightType METHOD = const HighlightType('METHOD');
+  static const HighlightType METHOD_STATIC = const HighlightType('METHOD_STATIC');
+  static const HighlightType PARAMETER = const HighlightType('PARAMETER');
+  static const HighlightType SETTER_DECLARATION = const HighlightType('SETTER_DECLARATION');
+  static const HighlightType TOP_LEVEL_VARIABLE = const HighlightType('TOP_LEVEL_VARIABLE');
+  static const HighlightType TYPE_NAME_DYNAMIC = const HighlightType('TYPE_NAME_DYNAMIC');
+  static const HighlightType TYPE_PARAMETER = const HighlightType('TYPE_PARAMETER');
+
+  final String name;
+
+  @override
+  String toString() => name;
+
+  const HighlightType(this.name);
+}
+
+
+/**
+ * A computer for navigation regions in a Dart [CompilationUnit].
+ */
+class DartUnitNavigationComputer {
+  final CompilationUnit _unit;
+
+  List<Map<String, Object>> _regions = [];
+
+  DartUnitNavigationComputer(this._unit);
+
+  /**
+   * Returns the computed navigation regions, not `null`.
+   */
+  List<Map<String, Object>> compute() {
+    _unit.accept(new _DartUnitNavigationComputerVisitor(this));
+    return new List.from(_regions);
+  }
+
+  void _addRegion(int offset, int length, Element element) {
+    Map<String, Object> target = _createTarget(element);
+    if (target == null) {
+      return;
+    }
+    _regions.add({
+      'offset': offset,
+      'length': length,
+      'targets': [target]
+    });
+  }
+
+  void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegion_nodeStart_nodeStart(AstNode a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.offset - offset;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegion_tokenStart_nodeEnd(Token a, AstNode b, Element element) {
+    int offset = a.offset;
+    int length = b.end - offset;
+    _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.
+   */
+  Map<String, Object> _createTarget(Element element) {
+    if (element == null) {
+      return null;
+    }
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+    // prepare Source
+    Source source = element.source;
+    if (source == null) {
+      return null;
+    }
+    // prepare location
+    int offset = element.nameOffset;
+    int length = element.displayName.length;
+    if (element is CompilationUnitElement) {
+      offset = 0;
+      length = 0;
+    }
+    // return as JSON
+    return {
+      'file': source.fullName,
+      'offset': offset,
+      'length': length,
+      'elementId': element.location.encoding
+    };
+  }
+}
+
+
+
+class _DartUnitNavigationComputerVisitor extends RecursiveAstVisitor {
+  final DartUnitNavigationComputer computer;
+
+  _DartUnitNavigationComputerVisitor(this.computer);
+
+  @override
+  visitAssignmentExpression(AssignmentExpression node) {
+    computer._addRegionForToken(node.operator, node.bestElement);
+    return super.visitAssignmentExpression(node);
+  }
+
+  @override
+  visitBinaryExpression(BinaryExpression node) {
+    computer._addRegionForToken(node.operator, node.bestElement);
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  visitConstructorDeclaration(ConstructorDeclaration node) {
+    // associate constructor with "T" or "T.name"
+    {
+      AstNode firstNode = node.returnType;
+      AstNode lastNode = node.name;
+      if (lastNode == null) {
+        lastNode = firstNode;
+      }
+      if (firstNode != null && lastNode != null) {
+        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode, node.element);
+      }
+    }
+    return super.visitConstructorDeclaration(node);
+  }
+
+  @override
+  visitExportDirective(ExportDirective node) {
+    ExportElement exportElement = node.element;
+    if (exportElement != null) {
+      Element element = exportElement.exportedLibrary;
+      computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
+    }
+    return super.visitExportDirective(node);
+  }
+
+  @override
+  visitImportDirective(ImportDirective node) {
+    ImportElement importElement = node.element;
+    if (importElement != null) {
+      Element element = importElement.importedLibrary;
+      computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element);
+    }
+    return super.visitImportDirective(node);
+  }
+
+  @override
+  visitIndexExpression(IndexExpression node) {
+    computer._addRegionForToken(node.rightBracket, node.bestElement);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  visitInstanceCreationExpression(InstanceCreationExpression node) {
+    computer._addRegion_nodeStart_nodeStart(node, node.argumentList, node.staticElement);
+    return super.visitInstanceCreationExpression(node);
+  }
+
+  @override
+  visitPartDirective(PartDirective node) {
+    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);
+    return super.visitPartOfDirective(node);
+  }
+
+  @override
+  visitPostfixExpression(PostfixExpression node) {
+    computer._addRegionForToken(node.operator, node.bestElement);
+    return super.visitPostfixExpression(node);
+  }
+
+  @override
+  visitPrefixExpression(PrefixExpression node) {
+    computer._addRegionForToken(node.operator, node.bestElement);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.parent is ConstructorDeclaration) {
+    } else {
+      computer._addRegionForNode(node, node.bestElement);
+    }
+    return super.visitSimpleIdentifier(node);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 99c6d67..32f5d8a 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -40,33 +40,39 @@
 
 
 const String ADDED = 'added';
-const String CHILDREN = 'children';
 const String CONTENT = 'content';
 const String DEFAULT = 'default';
-const String ELEMENT_LENGTH = 'elementLength';
-const String ELEMENT_OFFSET = 'elementOffset';
 const String EXCLUDED = 'excluded';
 const String ERRORS = 'errors';
 const String FILE = 'file';
 const String FILES = 'files';
 const String FIXES = 'fixes';
 const String INCLUDED = 'included';
-const String IS_ABSTRACT = 'isAbstract';
-const String IS_STATIC = 'isStatic';
-const String KIND = 'kind';
 const String LENGTH = 'length';
-const String NAME = 'name';
-const String NAME_LENGTH = 'nameLength';
-const String NAME_OFFSET = 'nameOffset';
 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 REFACTORINGS = 'refactorings';
 const String REGIONS = 'regions';
 const String REMOVED = 'removed';
-const String RETURN_TYPE = 'returnType';
 const String SUBSCRIPTIONS = 'subscriptions';
 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';
diff --git a/pkg/analysis_server/lib/src/context_directory_manager.dart b/pkg/analysis_server/lib/src/context_directory_manager.dart
index 20f51e5..cadbb0f 100644
--- a/pkg/analysis_server/lib/src/context_directory_manager.dart
+++ b/pkg/analysis_server/lib/src/context_directory_manager.dart
@@ -5,7 +5,6 @@
 library context.directory.manager;
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -26,7 +25,7 @@
    * Map from full path to the [Source] object, for each source that has been
    * added to the context.
    */
-  Map<String, Source> sources = new HashMap<String, Source>();
+  Map<String, Source> sources = <String, Source>{};
 }
 
 /**
@@ -39,7 +38,7 @@
    * recent successful call to [setRoots].
    */
   Map<Folder, _ContextDirectoryInfo> _currentDirectoryInfo =
-      new HashMap<Folder, _ContextDirectoryInfo>();
+      <Folder, _ContextDirectoryInfo>{};
 
   /**
    * The [ResourceProvider] using which paths are converted into [Resource]s.
@@ -55,7 +54,7 @@
   void setRoots(List<String> includedPaths,
                 List<String> excludedPaths) {
     // included
-    Set<Folder> includedFolders = new HashSet<Folder>();
+    Set<Folder> includedFolders = new Set<Folder>();
     for (int i = 0; i < includedPaths.length; i++) {
       String path = includedPaths[i];
       Resource resource = resourceProvider.getResource(path);
@@ -74,15 +73,14 @@
       throw new UnimplementedError(
           'Excluded paths are not supported yet');
     }
-    Set<Folder> excludedFolders = new HashSet<Folder>();
+    Set<Folder> excludedFolders = new Set<Folder>();
     // diff
     Set<Folder> currentFolders = _currentDirectoryInfo.keys.toSet();
     Set<Folder> newFolders = includedFolders.difference(currentFolders);
     Set<Folder> oldFolders = currentFolders.difference(includedFolders);
     // remove old contexts
     for (Folder folder in oldFolders) {
-      _currentDirectoryInfo.remove(folder);
-      removeContext(folder);
+      // TODO(scheglov) implement
     }
     // add new contexts
     for (Folder folder in newFolders) {
@@ -195,9 +193,4 @@
    * changes that need to be applied to the context.
    */
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet);
-
-  /**
-   * Remove the context associated with the given [folder].
-   */
-  void removeContext(Folder folder);
-}
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 33b0e0d..129ac81 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -4,8 +4,6 @@
 
 library domain.analysis;
 
-import 'dart:collection';
-
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -85,14 +83,14 @@
     {
       RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS);
       Map<String, List<String>> subStringMap = subDatum.asStringListMap();
-      subMap = new HashMap<AnalysisService, Set<String>>();
+      subMap = new Map<AnalysisService, Set<String>>();
       subStringMap.forEach((String serviceName, List<String> paths) {
         AnalysisService service = Enum2.valueOf(AnalysisService.VALUES, serviceName);
         if (service == null) {
           throw new RequestFailure(
               new Response.unknownAnalysisService(request, serviceName));
         }
-        subMap[service] = new HashSet.from(paths);
+        subMap[service] = new Set.from(paths);
       });
     }
     server.setAnalysisSubscriptions(subMap);
@@ -100,7 +98,7 @@
   }
 
   Response updateContent(Request request) {
-    var changes = new HashMap<String, ContentChange>();
+    var changes = new Map<String, ContentChange>();
     RequestDatum filesDatum = request.getRequiredParameter(FILES);
     filesDatum.forEachMap((file, changeDatum) {
       var change = new ContentChange();
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index f0f577f..ce8ad00 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -6,6 +6,9 @@
 
 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';
 
 /**
@@ -64,57 +67,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/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 44d1f02..ed8cfd8 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -6,9 +6,7 @@
 
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/analysis_server.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/computers.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -77,9 +75,6 @@
         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);
@@ -88,7 +83,6 @@
   }
 }
 
-
 void sendAnalysisNotificationErrors(AnalysisServer server,
                                     String file, List<AnalysisError> errors) {
   Notification notification = new Notification(NOTIFICATION_ERRORS);
@@ -97,7 +91,6 @@
   server.sendNotification(notification);
 }
 
-
 void sendAnalysisNotificationHighlights(AnalysisServer server,
                                         String file, CompilationUnit dartUnit) {
   Notification notification = new Notification(NOTIFICATION_HIGHLIGHTS);
@@ -108,7 +101,6 @@
   server.sendNotification(notification);
 }
 
-
 void sendAnalysisNotificationNavigation(AnalysisServer server,
                                         String file, CompilationUnit dartUnit) {
   Notification notification = new Notification(NOTIFICATION_NAVIGATION);
@@ -119,18 +111,6 @@
   server.sendNotification(notification);
 }
 
-
-void sendAnalysisNotificationOutline(AnalysisServer server,
-                                        String file, CompilationUnit dartUnit) {
-  Notification notification = new Notification(NOTIFICATION_OUTLINE);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      OUTLINE,
-      new DartUnitOutlineComputer(dartUnit).compute());
-  server.sendNotification(notification);
-}
-
-
 Map<String, Object> errorToJson(AnalysisError analysisError) {
   // TODO(paulberry): move this function into the AnalysisError class.
   ErrorCode errorCode = analysisError.errorCode;
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index fddf7d2..9efbf64 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -4,7 +4,6 @@
 
 library protocol;
 
-import 'dart:collection';
 import 'dart:convert' show JsonDecoder;
 
 /**
@@ -78,7 +77,7 @@
   /**
    * A table mapping the names of request parameters to their values.
    */
-  final Map<String, Object> params = new HashMap<String, Object>();
+  final Map<String, Object> params = new Map<String, Object>();
 
   /**
    * A decoder that can be used to decode strings into JSON objects.
@@ -439,7 +438,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 HashMap<String, Object>();
+  final Map<String, Object> result = new Map<String, Object>();
 
   /**
    * Initialize a newly created instance to represent a response to a request
@@ -647,7 +646,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> data = new HashMap<String, Object>();
+  final Map<String, Object> data = new Map<String, Object>();
 
   /**
    * Initialize a newly created [Error] to have the given [code] and [message].
@@ -766,7 +765,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> params = new HashMap<String, Object>();
+  final Map<String, Object> params = new Map<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 565282b..e3df8af 100644
--- a/pkg/analysis_server/lib/src/resource.dart
+++ b/pkg/analysis_server/lib/src/resource.dart
@@ -5,7 +5,6 @@
 library resource;
 
 import 'dart:async';
-import 'dart:collection';
 import 'dart:io' as io;
 
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
@@ -266,12 +265,11 @@
  * Use `/` as a path separator.
  */
 class MemoryResourceProvider implements ResourceProvider {
-  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, _MemoryResource> _pathToResource = <String, _MemoryResource>{};
+  final Map<String, String> _pathToContent = <String, String>{};
+  final Map<String, int> _pathToTimestamp = <String, int>{};
   final Map<String, StreamController<WatchEvent>> _pathToWatcher =
-      new HashMap<String, StreamController<WatchEvent>>();
+      <String, StreamController<WatchEvent>>{};
   int nextStamp = 0;
 
   @override
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 1ecacbd..eb003a9 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -11,7 +11,7 @@
   args: any
   logging: any
   path: any
-  typed_mock: '>=0.0.3'
+  typed_mock: any
   watcher: any
 dev_dependencies:
   mock: '>=0.10.0 <0.11.0'
diff --git a/pkg/analysis_server/test/analysis_abstract_test.dart b/pkg/analysis_server/test/analysis_abstract_test.dart
new file mode 100644
index 0000000..bc26d3e
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_abstract_test.dart
@@ -0,0 +1,284 @@
+// 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.abstract;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+
+main() {
+}
+
+
+/**
+ * An abstract base for all 'analysis' domain tests.
+ */
+class AbstractAnalysisTest {
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  AnalysisDomainHandler handler;
+
+  Map<String, List<String>> analysisSubscriptions = {};
+
+  String projectPath = '/project';
+  String testFile = '/project/bin/test.dart';
+  String testCode;
+
+//  Map<String, List<AnalysisError>> filesErrors = {};
+//  Map<String, List<Map<String, Object>>> filesHighlights = {};
+//  Map<String, List<Map<String, Object>>> filesNavigation = {};
+
+
+  AbstractAnalysisTest() {
+  }
+
+  void setUp() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(serverChannel, resourceProvider);
+    handler = new AnalysisDomainHandler(server);
+    // listen for notifications
+    Stream<Notification> notificationStream = serverChannel.notificationController.stream;
+    notificationStream.listen((Notification notification) {
+      processNotification(notification);
+    });
+    // create an empty project
+    _createEmptyProject();
+  }
+
+  void addAnalysisSubscription(AnalysisService service, String file) {
+    // add file to subscription
+    var files = analysisSubscriptions[service.name];
+    if (files == null) {
+      files = <String>[];
+      analysisSubscriptions[service.name] = files;
+    }
+    files.add(file);
+    // set subscriptions
+    Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS);
+    request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
+    handleSuccessfulRequest(request);
+  }
+
+  void tearDown() {
+    server.done();
+    handler = null;
+    server = null;
+    resourceProvider = null;
+    serverChannel = null;
+  }
+
+  void processNotification(Notification notification) {
+//    if (notification.event == NOTIFICATION_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) {
+//      String file = notification.getParameter(FILE);
+//      filesHighlights[file] = notification.getParameter(REGIONS);
+//    }
+//    if (notification.event == NOTIFICATION_NAVIGATION) {
+//      String file = notification.getParameter(FILE);
+//      filesNavigation[file] = notification.getParameter(REGIONS);
+//    }
+  }
+
+  /**
+   * Returns a [Future] that completes when the [AnalysisServer] finishes
+   * all its scheduled tasks.
+   */
+  Future waitForTasksFinished() {
+    return waitForServerOperationsPerformed(server);
+  }
+
+  /**
+   * Returns the offset of [search] in [testCode].
+   * Fails if not found.
+   */
+  int findFileOffset(String path, String search) {
+    File file = resourceProvider.getResource(path) as File;
+    String code = file.createSource(UriKind.FILE_URI).contents.data;
+    int offset = code.indexOf(search);
+    expect(offset, isNot(-1), reason: '"$search" in\n$code');
+    return offset;
+  }
+
+  /**
+   * Returns the offset of [search] in [testCode].
+   * Fails if not found.
+   */
+  int findOffset(String search) {
+    int offset = testCode.indexOf(search);
+    expect(offset, isNot(-1));
+    return offset;
+  }
+
+//  /**
+//   * Returns [AnalysisError]s recorded for the given [file].
+//   * May be empty, but not `null`.
+//   */
+//  List<AnalysisError> getErrors(String file) {
+//    List<AnalysisError> errors = filesErrors[file];
+//    if (errors != null) {
+//      return errors;
+//    }
+//    return <AnalysisError>[];
+//  }
+//
+//  /**
+//   * Returns highlights recorded for the given [file].
+//   * May be empty, but not `null`.
+//   */
+//  List<Map<String, Object>> getHighlights(String file) {
+//    List<Map<String, Object>> highlights = filesHighlights[file];
+//    if (highlights != null) {
+//      return highlights;
+//    }
+//    return [];
+//  }
+//
+//  /**
+//   * Returns navigation regions recorded for the given [file].
+//   * May be empty, but not `null`.
+//   */
+//  List<Map<String, Object>> getNavigation(String file) {
+//    List<Map<String, Object>> navigation = filesNavigation[file];
+//    if (navigation != null) {
+//      return navigation;
+//    }
+//    return [];
+//  }
+//
+//  /**
+//   * Returns [AnalysisError]s recorded for the [testFile].
+//   * May be empty, but not `null`.
+//   */
+//  List<AnalysisError> getTestErrors() {
+//    return getErrors(testFile);
+//  }
+//
+//  /**
+//   * Returns highlights recorded for the given [testFile].
+//   * May be empty, but not `null`.
+//   */
+//  List<Map<String, Object>> getTestHighlights() {
+//    return getHighlights(testFile);
+//  }
+//
+//  /**
+//   * Returns navigation information recorded for the given [testFile].
+//   * May be empty, but not `null`.
+//   */
+//  List<Map<String, Object>> getTestNavigation() {
+//    return getNavigation(testFile);
+//  }
+
+  /**
+   * Creates an empty project `/project/`.
+   */
+  void _createEmptyProject() {
+    resourceProvider.newFolder(projectPath);
+    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    request.setParameter(INCLUDED, [projectPath]);
+    request.setParameter(EXCLUDED, []);
+    handleSuccessfulRequest(request);
+  }
+
+//  /**
+//   * Creates a project with a single Dart file `/project/bin/test.dart` with
+//   * the given [code].
+//   */
+//  void createSingleFileProject(code) {
+//    this.testCode = _getCodeString(code);
+//    resourceProvider.newFolder('/project');
+//    resourceProvider.newFile(testFile, testCode);
+//    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+//    request.setParameter(INCLUDED, ['/project']);
+//    request.setParameter(EXCLUDED, []);
+//    handleSuccessfulRequest(request);
+//  }
+
+  String addFile(String path, String content) {
+    resourceProvider.newFile(path, content);
+    return path;
+  }
+
+  String addTestFile(String content) {
+    addFile(testFile, content);
+    this.testCode = content;
+    return testFile;
+  }
+
+  /**
+   * Validates that the given [request] is handled successfully.
+   */
+  void handleSuccessfulRequest(Request request) {
+    Response response = handler.handleRequest(request);
+    expect(response, isResponseSuccess('0'));
+  }
+
+  static String _getCodeString(code) {
+    if (code is List<String>) {
+      code = code.join('\n');
+    }
+    return code as String;
+  }
+}
+
+
+
+class AnalysisError {
+  final String file;
+  final String errorCode;
+  final int offset;
+  final int length;
+  final String message;
+  final String correction;
+  AnalysisError(this.file, this.errorCode, this.offset, this.length,
+      this.message, this.correction);
+
+  @override
+  String toString() {
+    return 'NotificationError(file=$file; errorCode=$errorCode; '
+        'offset=$offset; length=$length; message=$message)';
+  }
+}
+
+
+AnalysisError _jsonToAnalysisError(Map<String, Object> json) {
+  return new AnalysisError(
+      json['file'],
+      json['errorCode'],
+      json['offset'],
+      json['length'],
+      json['message'],
+      json['correction']);
+}
+
+
+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;
+}
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index 9359581..0268147 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -11,42 +11,21 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract.dart';
+import 'analysis_abstract_test.dart';
 import 'reflective_tests.dart';
 
 
-main() {
-  group('notification.navigation', () {
-    runReflectiveTests(AnalysisNotificationNavigationTest);
-  });
-}
-
-
 @ReflectiveTestCase()
 class AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
-  List<_NavigationRegion> regions;
-  _NavigationRegion testRegion;
-  List<_NavigationTarget> testTargets;
+  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 = [];
-        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'];
-            targets.add(new _NavigationTarget(targetFile, targetOffset, targetLength));
-          }
-          var region = new _NavigationRegion(regionOffset, regionLength, targets);
-          regions.add(region);
-        }
+        regions = notification.getParameter(REGIONS);
       }
     }
   }
@@ -69,15 +48,15 @@
    * 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)) {
+    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;
+        testTargets = region['targets'];
         return;
       }
     }
@@ -120,7 +99,16 @@
     if (length == -1) {
       length = findIdentifierLength(search);
     }
-    assertHasFileTarget(testFile, offset, length);
+    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')}');
   }
 
   /**
@@ -128,10 +116,10 @@
    * and with the given [length].
    */
   void assertHasFileTarget(String file, int offset, int length) {
-    for (_NavigationTarget target in testTargets) {
-      if (target.file == file &&
-          target.offset == offset &&
-          target.length == length) {
+    for (Map<String, Object> target in testTargets) {
+      if (target['file'] == file &&
+          target['offset'] == offset &&
+          target['length'] == length) {
         return;
       }
     }
@@ -254,20 +242,6 @@
     });
   }
 
-  test_instanceCreation_implicit() {
-    addTestFile('''
-class A {
-}
-main() {
-  new A();
-}
-''');
-    return prepareNavigation(() {
-      assertHasRegionString('new A');
-      assertHasTarget('A {');
-    });
-  }
-
   test_instanceCreation_named() {
     addTestFile('''
 class A {
@@ -439,19 +413,8 @@
 }
 
 
-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;
-
-  _NavigationTarget(this.file, this.offset, this.length);
-}
+main() {
+  group('notification.navigation', () {
+    runReflectiveTests(AnalysisNotificationNavigationTest);
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 93149c8..b3c11f6 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -5,6 +5,7 @@
 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';
diff --git a/pkg/analysis_server/test/context_directory_manager_test.dart b/pkg/analysis_server/test/context_directory_manager_test.dart
index 0bebce0..283dd63 100644
--- a/pkg/analysis_server/test/context_directory_manager_test.dart
+++ b/pkg/analysis_server/test/context_directory_manager_test.dart
@@ -21,10 +21,9 @@
 
   @override
   void addContext(Folder folder, File pubspecFile) {
-    String path = folder.path;
-    currentContextPaths.add(path);
-    currentContextPubspecPaths[path] = pubspecFile != null ? pubspecFile.path : null;
-    currentContextFilePaths[path] = new Set<String>();
+    currentContextPaths.add(folder.path);
+    currentContextPubspecPaths[folder.path] = pubspecFile != null ? pubspecFile.path : null;
+    currentContextFilePaths[folder.path] = new Set<String>();
   }
 
   @override
@@ -40,14 +39,6 @@
     }
     // TODO(paulberry): handle source.changedSources.
   }
-
-  @override
-  void removeContext(Folder folder) {
-    String path = folder.path;
-    currentContextPaths.remove(path);
-    currentContextPubspecPaths.remove(path);
-    currentContextFilePaths.remove(path);
-  }
 }
 
 main() {
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index d3b3720..4e1fa97 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -6,9 +6,9 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/src/computer/computer_highlights.dart';
 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';
@@ -1353,21 +1353,6 @@
   });
 
   group('instanceCreation', () {
-    test('implicit', () {
-      var code = '''
-class A {
-}
-main() {
-  new A();
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasRegionInts(
-            helper.findOffset('new A'), 'new A'.length,
-            helper.findOffset('A {'), 'A'.length);
-      });
-    });
-
     test('named', () {
       var code = '''
 class A {
diff --git a/pkg/analysis_server/test/operation/operation_queue_test.dart b/pkg/analysis_server/test/operation/operation_queue_test.dart
index 32dcd78..2b05e14 100644
--- a/pkg/analysis_server/test/operation/operation_queue_test.dart
+++ b/pkg/analysis_server/test/operation/operation_queue_test.dart
@@ -54,7 +54,8 @@
       });
 
       test('use operation priorities', () {
-        when(server.isPriorityContext(anyObject)).thenReturn(false);
+        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
+        when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = mockOperation(ServerOperationPriority.SEARCH);
         var operationB = mockOperation(ServerOperationPriority.REFACTORING);
@@ -69,7 +70,8 @@
       });
 
       test('continue analysis first', () {
-        when(server.isPriorityContext(anyObject)).thenReturn(false);
+        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
+        when(server.isPriorityContext(anyObject as dynamic)).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/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 5ab0a4a..42cf5a9 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -5,7 +5,6 @@
 import 'package:unittest/unittest.dart';
 
 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 'domain_analysis_test.dart' as domain_analysis_test;
@@ -22,7 +21,6 @@
   groupSep = ' | ';
   group('analysis_server', () {
     analysis_notification_navigation_test.main();
-    analysis_notification_outline_test.main();
     analysis_server_test.main();
     channel_test.main();
     domain_analysis_test.main();
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 3d5b98f..870309a 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 HashMap<String, Object>();
+        _propertyMap = new Map<String, Object>();
       }
       _propertyMap[propertyName] = propertyValue;
     }
@@ -4554,7 +4554,7 @@
 
   @override
   Object visitMapLiteral(MapLiteral node) {
-    HashMap<String, Object> map = new HashMap<String, Object>();
+    Map<String, Object> map = new Map<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
       Object key = entry.key.accept(this);
       Object value = entry.value.accept(this);
@@ -14508,7 +14508,7 @@
 
   AstNode _immediateChild;
 
-  Map<String, SimpleIdentifier> _locals = new HashMap<String, SimpleIdentifier>();
+  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
 
   final int _position;
 
@@ -18305,7 +18305,7 @@
   }
 
   /**
-   * Validate the given directive, but do not check for existence.
+   * Validate the given directive, but do not check for existance.
    *
    * @return a code indicating the problem if there is one, or `null` no problem
    */
@@ -18588,7 +18588,6 @@
 
   @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 c911a76..b5c986d 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -7,7 +7,6 @@
 
 library engine.constant;
 
-import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart' show ObjectUtilities;
 import 'source.dart' show Source;
@@ -230,12 +229,12 @@
   /**
    * A table mapping constant variable elements to the declarations of those variables.
    */
-  final HashMap<VariableElement, VariableDeclaration> variableMap = new HashMap<VariableElement, VariableDeclaration>();
+  final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final HashMap<ConstructorElement, ConstructorDeclaration> constructorMap = new HashMap<ConstructorElement, ConstructorDeclaration>();
+  final Map<ConstructorElement, ConstructorDeclaration> constructorMap = new Map<ConstructorElement, ConstructorDeclaration>();
 
   /**
    * A collection of constant constructor invocations.
@@ -306,12 +305,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  HashMap<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
+  Map<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
 
   /**
    * A collection of constant constructor invocations.
@@ -492,7 +491,7 @@
   ValidResult _evaluateConstructorCall(NodeList<Expression> arguments, ConstructorElement constructor, ConstantVisitor constantVisitor) {
     int argumentCount = arguments.length;
     List<DartObjectImpl> argumentValues = new List<DartObjectImpl>(argumentCount);
-    HashMap<String, DartObjectImpl> namedArgumentValues = new HashMap<String, DartObjectImpl>();
+    Map<String, DartObjectImpl> namedArgumentValues = new Map<String, DartObjectImpl>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -535,8 +534,8 @@
       // been reported, so consider it an unknown value to suppress further errors.
       return constantVisitor._validWithUnknownValue(definingClass);
     }
-    HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
-    HashMap<String, DartObjectImpl> parameterMap = new HashMap<String, DartObjectImpl>();
+    Map<String, DartObjectImpl> fieldMap = new Map<String, DartObjectImpl>();
+    Map<String, DartObjectImpl> parameterMap = new Map<String, DartObjectImpl>();
     List<ParameterElement> parameters = constructorBase.parameters;
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
@@ -611,7 +610,7 @@
     return constantVisitor._valid(definingClass, new GenericState(fieldMap));
   }
 
-  void _evaluateSuperConstructorCall(HashMap<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
+  void _evaluateSuperConstructorCall(Map<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;
@@ -628,7 +627,7 @@
    *         constructor will be returned.
    */
   ConstructorElement _followConstantRedirectionChain(ConstructorElement constructor) {
-    HashSet<ConstructorElement> constructorsVisited = new HashSet<ConstructorElement>();
+    Set<ConstructorElement> constructorsVisited = new Set<ConstructorElement>();
     while (constructor.isFactory) {
       if (identical(constructor.enclosingElement.type, typeProvider.symbolType)) {
         // The dart:core.Symbol has a const factory constructor that redirects to
@@ -759,7 +758,7 @@
    */
   DartObjectImpl _nullObject;
 
-  HashMap<String, DartObjectImpl> _lexicalEnvironment;
+  Map<String, DartObjectImpl> _lexicalEnvironment;
 
   /**
    * Initialize a newly created constant visitor.
@@ -779,7 +778,7 @@
    * @param lexicalEnvironment values which should override simpleIdentifiers, or null if no
    *          overriding is necessary.
    */
-  ConstantVisitor.con2(this._typeProvider, HashMap<String, DartObjectImpl> lexicalEnvironment) {
+  ConstantVisitor.con2(this._typeProvider, Map<String, DartObjectImpl> lexicalEnvironment) {
     this._lexicalEnvironment = lexicalEnvironment;
   }
 
@@ -947,7 +946,7 @@
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
     }
     ErrorResult result = null;
-    HashMap<DartObjectImpl, DartObjectImpl> map = new HashMap<DartObjectImpl, DartObjectImpl>();
+    Map<DartObjectImpl, DartObjectImpl> map = new Map<DartObjectImpl, DartObjectImpl>();
     for (MapLiteralEntry entry in node.entries) {
       EvaluationResultImpl keyResult = entry.key.accept(this);
       EvaluationResultImpl valueResult = entry.value.accept(this);
@@ -1440,7 +1439,7 @@
     return null;
   }
 
-  HashMap<String, DartObjectImpl> get fields => _state.fields;
+  Map<String, DartObjectImpl> get fields => _state.fields;
 
   @override
   int get intValue {
@@ -1730,7 +1729,7 @@
   /**
    * A table mapping the names of declared variables to their values.
    */
-  HashMap<String, String> _declaredVariables = new HashMap<String, String>();
+  Map<String, String> _declaredVariables = new Map<String, String>();
 
   /**
    * Define a variable with the given name to have the given value.
@@ -2822,7 +2821,7 @@
   /**
    * The values of the fields of this instance.
    */
-  final HashMap<String, DartObjectImpl> _fieldMap;
+  final Map<String, DartObjectImpl> _fieldMap;
 
   /**
    * Pseudo-field that we use to represent fields in the superclass.
@@ -2832,7 +2831,7 @@
   /**
    * A state that can be used to represent an object whose state is not known.
    */
-  static GenericState UNKNOWN_VALUE = new GenericState(new HashMap<String, DartObjectImpl>());
+  static GenericState UNKNOWN_VALUE = new GenericState(new Map<String, DartObjectImpl>());
 
   /**
    * Initialize a newly created state to represent a newly created object.
@@ -2859,7 +2858,7 @@
       return false;
     }
     GenericState state = object as GenericState;
-    HashSet<String> otherFields = new HashSet<String>.from(state._fieldMap.keys.toSet());
+    Set<String> otherFields = new Set<String>.from(state._fieldMap.keys.toSet());
     for (String fieldName in _fieldMap.keys.toSet()) {
       if (_fieldMap[fieldName] != state._fieldMap[fieldName]) {
         return false;
@@ -2875,7 +2874,7 @@
   }
 
   @override
-  HashMap<String, DartObjectImpl> get fields => _fieldMap;
+  Map<String, DartObjectImpl> get fields => _fieldMap;
 
   @override
   String get typeName => "user defined type";
@@ -3015,7 +3014,7 @@
    * If this represents a generic dart object, return a map from its fieldnames to their values.
    * Otherwise return null.
    */
-  HashMap<String, DartObjectImpl> get fields => null;
+  Map<String, DartObjectImpl> get fields => null;
 
   /**
    * Return the name of the type of this value.
@@ -3843,7 +3842,7 @@
   /**
    * The entries in the map.
    */
-  final HashMap<DartObjectImpl, DartObjectImpl> _entries;
+  final Map<DartObjectImpl, DartObjectImpl> _entries;
 
   /**
    * Initialize a newly created state to represent a map with the given entries.
@@ -3869,7 +3868,7 @@
     if (object is! MapState) {
       return false;
     }
-    HashMap<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
+    Map<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
     int count = _entries.length;
     if (otherElements.length != count) {
       return false;
@@ -3892,7 +3891,7 @@
 
   @override
   Map<Object, Object> get value {
-    HashMap<Object, Object> result = new HashMap<Object, Object>();
+    Map<Object, Object> result = new Map<Object, Object>();
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
       DartObjectImpl key = entry.getKey();
       DartObjectImpl value = entry.getValue();
@@ -4104,12 +4103,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  final HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  final Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final HashMap<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
+  final Map<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 0bbe88b..50b872b 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>();
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<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 HashSet<ClassElement>());
+  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new Set<ClassElement>());
 
   @override
   bool get isProxy {
@@ -1701,7 +1701,7 @@
   }
 
   PropertyAccessorElement _internalLookUpGetter(String getterName, LibraryElement library, bool includeThisClass) {
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getGetter(getterName);
@@ -1733,7 +1733,7 @@
   }
 
   MethodElement _internalLookUpMethod(String methodName, LibraryElement library, bool includeThisClass) {
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       MethodElement element = currentElement.getMethod(methodName);
@@ -1765,7 +1765,7 @@
   }
 
   PropertyAccessorElement _internalLookUpSetter(String setterName, LibraryElement library, bool includeThisClass) {
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getSetter(setterName);
@@ -1796,7 +1796,7 @@
     return null;
   }
 
-  bool _safeIsOrInheritsProxy(ClassElement classElt, HashSet<ClassElement> visitedClassElts) {
+  bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
     }
@@ -4624,9 +4624,6 @@
   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
@@ -5151,7 +5148,7 @@
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
 
   @override
   String get displayName {
@@ -5454,7 +5451,7 @@
   }
 
   @override
-  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
 
   @override
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => substitute2(argumentTypes, typeArguments);
@@ -6531,7 +6528,7 @@
    * @return the computed longest inheritance path to Object
    * @see InterfaceType#getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new HashSet<ClassElement>());
+  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new Set<ClassElement>());
 
   /**
    * Returns the set of all superinterfaces of the passed [Type].
@@ -6540,7 +6537,7 @@
    * @return the [Set] of superinterfaces of the passed [Type]
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new HashSet<InterfaceType>());
+  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new Set<InterfaceType>());
 
   /**
    * This method computes the longest inheritance path from some passed [Type] to Object. This
@@ -6555,7 +6552,7 @@
    * @see #computeLongestInheritancePathToObject(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, HashSet<ClassElement> visitedClasses) {
+  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
     ClassElement classElement = type.element;
     // Object case
     if (classElement.supertype == null || visitedClasses.contains(classElement)) {
@@ -6599,7 +6596,7 @@
    * @see #computeSuperinterfaceSet(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, HashSet<InterfaceType> set) {
+  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, Set<InterfaceType> set) {
     Element element = type.element;
     if (element != null) {
       List<InterfaceType> superinterfaces = type.interfaces;
@@ -6627,7 +6624,7 @@
    * @return the intersection of the given sets of types
    */
   static List<InterfaceType> _intersection(Set<InterfaceType> first, Set<InterfaceType> second) {
-    Set<InterfaceType> result = new HashSet<InterfaceType>.from(first);
+    Set<InterfaceType> result = new Set<InterfaceType>.from(first);
     result.retainAll(second);
     return new List.from(result);
   }
@@ -6691,7 +6688,7 @@
   InterfaceTypeImpl.con2(String name) : super(null, name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
 
   @override
   List<PropertyAccessorElement> get accessors {
@@ -6963,7 +6960,7 @@
         return element;
       }
     }
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7001,7 +6998,7 @@
         return element;
       }
     }
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7039,7 +7036,7 @@
         return element;
       }
     }
-    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7117,7 +7114,7 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    return _isMoreSpecificThan(type as InterfaceType, new HashSet<ClassElement>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(type as InterfaceType, new Set<ClassElement>(), withDynamic, visitedTypePairs);
   }
 
   @override
@@ -7141,10 +7138,10 @@
     } else if (this == type) {
       return true;
     }
-    return _isSubtypeOf(type as InterfaceType, new HashSet<ClassElement>(), visitedTypePairs);
+    return _isSubtypeOf(type as InterfaceType, new Set<ClassElement>(), visitedTypePairs);
   }
 
-  bool _isMoreSpecificThan(InterfaceType s, HashSet<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isMoreSpecificThan(InterfaceType s, Set<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:
@@ -7208,7 +7205,7 @@
     return false;
   }
 
-  bool _isSubtypeOf(InterfaceType type, HashSet<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isSubtypeOf(InterfaceType type, Set<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
     InterfaceType typeT = this;
     InterfaceType typeS = type;
     ClassElement elementT = element;
@@ -7630,7 +7627,7 @@
 
   @override
   List<LibraryElement> get exportedLibraries {
-    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
+    Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ExportElement element in _exports) {
       LibraryElement library = element.exportedLibrary;
       if (library != null) {
@@ -7645,7 +7642,7 @@
 
   @override
   List<LibraryElement> get importedLibraries {
-    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
+    Set<LibraryElement> libraries = new Set<LibraryElement>();
     for (ImportElement element in _imports) {
       LibraryElement library = element.importedLibrary;
       if (library != null) {
@@ -7694,7 +7691,7 @@
 
   @override
   List<PrefixElement> get prefixes {
-    HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
+    Set<PrefixElement> prefixes = new Set<PrefixElement>();
     for (ImportElement element in _imports) {
       PrefixElement prefix = element.prefix;
       if (prefix != null) {
@@ -8223,9 +8220,6 @@
    * @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);
@@ -8602,7 +8596,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(HashSet<Element> elements, Element element) {
+  static void _add(Set<Element> elements, Element element) {
     if (element is MultiplyDefinedElementImpl) {
       for (Element conflictingElement in element.conflictingElements) {
         elements.add(conflictingElement);
@@ -8622,7 +8616,7 @@
    * @return an array containing all of the conflicting elements
    */
   static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
-    HashSet<Element> elements = new HashSet<Element>();
+    Set<Element> elements = new Set<Element>();
     _add(elements, firstElement);
     _add(elements, secondElement);
     return new List.from(elements);
@@ -9816,14 +9810,6 @@
   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
@@ -9860,12 +9846,6 @@
   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);
@@ -10407,7 +10387,7 @@
   DartType getLeastUpperBound(DartType type) => null;
 
   @override
-  bool isAssignableTo(DartType type) => isAssignableTo2(type, new HashSet<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isAssignableTo2(type, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
@@ -10434,7 +10414,7 @@
   bool get isDynamic => false;
 
   @override
-  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new HashSet<TypeImpl_TypePair>());
+  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is more specific than the given type.
@@ -10463,7 +10443,7 @@
   bool get isObject => false;
 
   @override
-  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
+  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is a subtype of the given type.
@@ -10720,11 +10700,11 @@
     if (s.isDynamic) {
       return true;
     }
-    return _isMoreSpecificThan(s, new HashSet<DartType>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(s, new Set<DartType>(), withDynamic, visitedTypePairs);
   }
 
   @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new HashSet<TypeImpl_TypePair>());
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<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 6644649..c513eec 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -7,7 +7,6 @@
 
 library engine;
 
-import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'utilities_collection.dart';
@@ -19,10 +18,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
@@ -868,19 +867,19 @@
    * An array containing sources whose AST structure is needed in order to resolve the next library
    * to be resolved.
    */
-  HashSet<Source> _neededForResolution = null;
+  Set<Source> _neededForResolution = null;
 
   /**
    * A table mapping sources to the change notices that are waiting to be returned related to that
    * source.
    */
-  HashMap<Source, ChangeNoticeImpl> _pendingNotices = new HashMap<Source, ChangeNoticeImpl>();
+  Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<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].
    */
-  HashSet<String> _recentTasks = new HashSet<String>();
+  Set<String> _recentTasks = new Set<String>();
 
   /**
    * The object used to synchronize access to all of the caches. The rules related to the use of
@@ -1523,7 +1522,7 @@
    * @return a list of the sources that would be processed by [performAnalysisTask]
    */
   List<Source> get sourcesNeedingProcessing {
-    HashSet<Source> sources = new HashSet<Source>();
+    Set<Source> sources = new Set<Source>();
     bool hintsEnabled = _options.hint;
     //
     // Look for priority sources that need to be analyzed.
@@ -2491,7 +2490,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, HashSet<Source> librariesToInvalidate) {
+  void _computeAllLibrariesDependingOn(Source library, Set<Source> librariesToInvalidate) {
     if (librariesToInvalidate.add(library)) {
       for (Source dependentLibrary in getLibrariesDependingOn(library)) {
         _computeAllLibrariesDependingOn(dependentLibrary, librariesToInvalidate);
@@ -3520,7 +3519,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, HashSet<Source> sources) {
+  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, Set<Source> sources) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
@@ -3628,7 +3627,7 @@
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    */
   void _invalidateAllLocalResolutionInformation() {
-    HashMap<Source, List<Source>> oldPartMap = new HashMap<Source, List<Source>>();
+    Map<Source, List<Source>> oldPartMap = new Map<Source, List<Source>>();
     MapIterator<Source, SourceEntry> iterator = _privatePartition.iterator();
     while (iterator.moveNext()) {
       Source source = iterator.key;
@@ -3751,7 +3750,7 @@
    *          infinite recursion
    * @return `true` if this library is, or depends on, dart:html
    */
-  bool _isClient(LibraryElement library, Source htmlSource, HashSet<LibraryElement> visitedLibraries) {
+  bool _isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
     if (visitedLibraries.contains(library)) {
       return false;
     }
@@ -3871,7 +3870,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 HashSet<LibraryElement>()));
+              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new Set<LibraryElement>()));
             }
           } else {
             dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
@@ -3950,7 +3949,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 HashSet<LibraryElement>()));
+    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Set<LibraryElement>()));
   }
 
   /**
@@ -4039,7 +4038,7 @@
     Source librarySource = task.libraryElement.source;
     CaughtException thrownException = task.exception;
     DartEntry libraryEntry = null;
-    HashMap<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
+    Map<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.
@@ -4950,7 +4949,7 @@
    *
    * @param oldPartMap the table containing the parts associated with each library
    */
-  void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
+  void _removeFromPartsUsingMap(Map<Source, List<Source>> oldPartMap) {
     for (MapEntry<Source, List<Source>> entry in getMapEntrySet(oldPartMap)) {
       Source librarySource = entry.getKey();
       List<Source> oldParts = entry.getValue();
@@ -5037,7 +5036,7 @@
       _workManager.add(source, SourcePriority.HTML);
     } else if (sourceEntry is DartEntry) {
       List<Source> containingLibraries = getLibrariesContaining(source);
-      HashSet<Source> librariesToInvalidate = new HashSet<Source>();
+      Set<Source> librariesToInvalidate = new Set<Source>();
       for (Source containingLibrary in containingLibraries) {
         _computeAllLibrariesDependingOn(containingLibrary, librariesToInvalidate);
       }
@@ -5067,7 +5066,7 @@
       htmlCopy.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null));
       _cache.put(source, htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      HashSet<Source> libraries = new HashSet<Source>();
+      Set<Source> libraries = new Set<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5096,7 +5095,7 @@
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       _invalidateAngularResolution(htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      HashSet<Source> libraries = new HashSet<Source>();
+      Set<Source> libraries = new Set<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5262,7 +5261,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.
    */
-  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
+  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
 
   /**
    * The dependency graph used to compute the libraries in the cycle.
@@ -5559,7 +5558,7 @@
    *
    * @param library the library being tested
    */
-  void _ensureExports(ResolvableLibrary library, HashSet<Source> visitedLibraries) {
+  void _ensureExports(ResolvableLibrary library, Set<Source> visitedLibraries) {
     List<ResolvableLibrary> dependencies = library.exports;
     int dependencyCount = dependencies.length;
     for (int i = 0; i < dependencyCount; i++) {
@@ -5611,7 +5610,7 @@
    * cycle (but are not themselves in the cycle) have element models built for them.
    */
   void _ensureImportsAndExports() {
-    HashSet<Source> visitedLibraries = new HashSet<Source>();
+    Set<Source> visitedLibraries = new Set<Source>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -5667,9 +5666,9 @@
     }
   }
 
-  HashSet<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
+  Set<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
     int libraryCount = libraryData.length;
-    HashSet<Source> sources = new HashSet<Source>();
+    Set<Source> sources = new Set<Source>();
     for (int i = 0; i < libraryCount; i++) {
       List<CycleBuilder_SourceEntryPair> entryPairs = libraryData[i].entryPairs;
       int entryCount = entryPairs.length;
@@ -5785,11 +5784,11 @@
  * Implementation of the [AnalysisContextStatistics].
  */
 class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
-  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new HashMap<String, AnalysisContextStatistics_CacheRow>();
+  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new Map<String, AnalysisContextStatistics_CacheRow>();
 
   List<Source> _sources = new List<Source>();
 
-  HashSet<CaughtException> _exceptions = new HashSet<CaughtException>();
+  Set<CaughtException> _exceptions = new Set<CaughtException>();
 
   List<AnalysisContextStatistics_PartitionData> _partitionData;
 
@@ -5966,7 +5965,7 @@
   /**
    * A mapping from source to what type of analysis should be performed on that source.
    */
-  HashMap<Source, AnalysisLevel> _analysisMap = new HashMap<Source, AnalysisLevel>();
+  Map<Source, AnalysisLevel> _analysisMap = new Map<Source, AnalysisLevel>();
 
   /**
    * Return a collection of the sources that have been added. This is equivalent to calling
@@ -7646,7 +7645,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
+  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -7760,7 +7759,7 @@
   void _buildDirectiveModels() {
     AnalysisContext analysisContext = context;
     for (ResolvableLibrary library in librariesInCycle) {
-      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
+      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -7873,8 +7872,8 @@
    *
    * @return the map that was built
    */
-  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
-    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
+  Map<Source, ResolvableLibrary> _buildLibraryMap() {
+    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
     int libraryCount = librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = librariesInCycle[i];
@@ -7937,7 +7936,7 @@
   /**
    * A table mapping the sources known to the context to the information known about the source.
    */
-  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
+  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
 
   /**
    * The maximum number of sources for which AST structures should be kept in the cache.
@@ -8359,13 +8358,13 @@
    * A table mapping the sources whose content has been changed to the current content of those
    * sources.
    */
-  HashMap<Source, String> _changedContent = new HashMap<Source, String>();
+  Map<Source, String> _changedContent = new Map<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 HashMap<Source, ChangeSet_ContentChange> changedRanges = new HashMap<Source, ChangeSet_ContentChange>();
+  final Map<Source, ChangeSet_ContentChange> changedRanges = new Map<Source, ChangeSet_ContentChange>();
 
   /**
    * A list containing the sources that have been removed.
@@ -8537,7 +8536,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, HashMap<Source, dynamic> sources, bool needsSeparator, String label) {
+  bool _appendSources2(JavaStringBuilder builder, Map<Source, dynamic> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
@@ -10479,7 +10478,7 @@
    * A table mapping the sources that were analyzed to the hints that were generated for the
    * sources.
    */
-  HashMap<Source, TimestampedData<List<AnalysisError>>> _hintMap;
+  Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -10502,7 +10501,7 @@
    * @return a table mapping the sources that were analyzed to the hints that were generated for the
    *         sources
    */
-  HashMap<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
+  Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
 
   @override
   String get taskDescription {
@@ -10532,7 +10531,7 @@
     //
     // Store the results.
     //
-    _hintMap = new HashMap<Source, TimestampedData<List<AnalysisError>>>();
+    _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
     for (int i = 0; i < unitCount; i++) {
       int modificationTime = _units[i].modificationTime;
       Source source = _units[i].data.element.source;
@@ -12763,17 +12762,17 @@
   /**
    * A set containing the sources referenced by 'export' directives.
    */
-  HashSet<Source> _exportedSources = new HashSet<Source>();
+  Set<Source> _exportedSources = new Set<Source>();
 
   /**
    * A set containing the sources referenced by 'import' directives.
    */
-  HashSet<Source> _importedSources = new HashSet<Source>();
+  Set<Source> _importedSources = new Set<Source>();
 
   /**
    * A set containing the sources referenced by 'part' directives.
    */
-  HashSet<Source> _includedSources = new HashSet<Source>();
+  Set<Source> _includedSources = new Set<Source>();
 
   /**
    * The errors that were produced by scanning and parsing the source.
@@ -12908,7 +12907,7 @@
    * @param sources the set to be converted
    * @return an array containing all of the sources in the given set
    */
-  List<Source> _toArray(HashSet<Source> sources) {
+  List<Source> _toArray(Set<Source> sources) {
     int size = sources.length;
     if (size == 0) {
       return Source.EMPTY_ARRAY;
@@ -13072,7 +13071,7 @@
   /**
    * A table mapping SDK's to the partitions used for those SDK's.
    */
-  HashMap<DartSdk, SdkCachePartition> _sdkPartitions = new HashMap<DartSdk, SdkCachePartition>();
+  Map<DartSdk, SdkCachePartition> _sdkPartitions = new Map<DartSdk, SdkCachePartition>();
 
   /**
    * The default cache size for a Dart SDK partition.
@@ -13655,7 +13654,7 @@
   /**
    * A HashMap of lists containing the errors that were collected, keyed by each [Source].
    */
-  Map<Source, HashSet<AnalysisError>> _errors = new HashMap<Source, HashSet<AnalysisError>>();
+  Map<Source, Set<AnalysisError>> _errors = new Map<Source, Set<AnalysisError>>();
 
   /**
    * Add all of the errors recorded by the given listener to this listener.
@@ -13674,13 +13673,13 @@
    * @return an array of errors (not `null`, contains no `null`s)
    */
   List<AnalysisError> get errors {
-    Iterable<MapEntry<Source, HashSet<AnalysisError>>> entrySet = getMapEntrySet(_errors);
+    Iterable<MapEntry<Source, Set<AnalysisError>>> entrySet = getMapEntrySet(_errors);
     int numEntries = entrySet.length;
     if (numEntries == 0) {
       return AnalysisError.NO_ERRORS;
     }
     List<AnalysisError> resultList = new List<AnalysisError>();
-    for (MapEntry<Source, HashSet<AnalysisError>> entry in entrySet) {
+    for (MapEntry<Source, Set<AnalysisError>> entry in entrySet) {
       resultList.addAll(entry.getValue());
     }
     return new List.from(resultList);
@@ -13694,7 +13693,7 @@
    * @return the errors collected by the listener for the passed [Source]
    */
   List<AnalysisError> getErrorsForSource(Source source) {
-    HashSet<AnalysisError> errorsForSource = _errors[source];
+    Set<AnalysisError> errorsForSource = _errors[source];
     if (errorsForSource == null) {
       return AnalysisError.NO_ERRORS;
     } else {
@@ -13705,9 +13704,9 @@
   @override
   void onError(AnalysisError error) {
     Source source = error.source;
-    HashSet<AnalysisError> errorsForSource = _errors[source];
+    Set<AnalysisError> errorsForSource = _errors[source];
     if (_errors[source] == null) {
-      errorsForSource = new HashSet<AnalysisError>();
+      errorsForSource = new Set<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 1dc9439..e92f2ae 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -7,12 +7,11 @@
 
 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';
+import 'element.dart' show Element;
 
 /**
  * Instances of the class `AnalysisError` represent an error discovered during the analysis of
@@ -245,7 +244,7 @@
   /**
    * The properties associated with this error.
    */
-  HashMap<ErrorProperty, Object> _propertyMap = new HashMap<ErrorProperty, Object>();
+  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
 
   /**
    * Initialize a newly created analysis error for the specified source. The error has no location
@@ -354,9 +353,6 @@
 
   @override
   ErrorType get type => ErrorType.ANGULAR;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1004,20 +1000,14 @@
    * 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_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");
+  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");
 
   /**
    * 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', 76, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 75, "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
@@ -1027,7 +1017,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', 77, "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', 76, "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
@@ -1035,26 +1025,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 78, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 77, "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', 79, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 78, "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', 80, "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', 79, "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', 81, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 80, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1062,7 +1052,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', 82, "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', 81, "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
@@ -1070,7 +1060,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', 83, "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', 82, "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
@@ -1085,7 +1075,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 84, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 83, "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
@@ -1096,7 +1086,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 85, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 84, "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
@@ -1107,7 +1097,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 86, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 85, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1121,7 +1111,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', 87, "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', 86, "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> :
@@ -1135,7 +1125,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', 88, "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', 87, "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> :
@@ -1149,13 +1139,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', 89, "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', 88, "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', 90, "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', 89, "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
@@ -1163,17 +1153,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', 91, "'%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', 90, "'%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', 92, "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', 91, "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', 93, "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', 92, "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
@@ -1181,7 +1171,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  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");
+  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");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1191,7 +1181,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 95, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 94, "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
@@ -1199,7 +1189,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', 96, "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', 95, "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.
@@ -1218,43 +1208,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', 97, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 96, "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', 98, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 97, "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', 99, "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', 98, "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', 100, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 99, "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', 101, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 100, "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', 102, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 101, "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', 103, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 102, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1264,7 +1254,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', 104, "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', 103, "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
@@ -1273,13 +1263,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', 105, "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', 104, "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', 106, "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', 105, "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;
@@ -1290,7 +1280,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', 107, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 106, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1304,13 +1294,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', 108, "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', 107, "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', 109, "Default values of an optional parameter must be 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");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1319,13 +1309,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', 110, "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', 109, "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', 111, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 110, "'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
@@ -1334,13 +1324,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', 112, "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', 111, "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', 113, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 112, "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
@@ -1349,13 +1339,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', 114, "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', 113, "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', 115, "The values in a 'const' map must be 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");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1364,7 +1354,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', 116, "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', 115, "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
@@ -1374,13 +1364,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', 117, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 116, "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', 118, "Initializer expressions in constant constructors must be constants");
+  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");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
@@ -1389,7 +1379,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', 119, "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', 118, "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>.
@@ -1400,7 +1390,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', 120, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 119, "%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
@@ -1408,17 +1398,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', 121, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 120, "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', 122, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 121, "");
 
   /**
    * 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', 123, "Optional parameters are not allowed when defining 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");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1426,25 +1416,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', 124, "The included part '%s' must have a part-of directive");
+  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");
 
   /**
    * 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', 125, "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', 124, "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', 126, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 125, "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', 127, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 126, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1455,13 +1445,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 128, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 127, "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', 129, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 128, "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
@@ -1474,7 +1464,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', 130, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 129, "'%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
@@ -1486,7 +1476,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', 131, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 130, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1498,7 +1488,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', 132, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 131, "'%s' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1510,61 +1500,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', 133, "'%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', 132, "'%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', 134, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 133, "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', 135, "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', 134, "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', 136, "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', 135, "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', 137, "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', 136, "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', 138, "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', 137, "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', 139, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 138, "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', 140, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 139, "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', 141, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 140, "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', 142, "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', 141, "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
@@ -1574,19 +1564,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', 143, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 142, "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', 144, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 143, "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', 145, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 144, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1605,19 +1595,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', 146, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 145, "'%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', 147, "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', 146, "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', 148, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 147, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1625,7 +1615,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', 149, "The class '%s' does not have a generative constructor '%s'");
+  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'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1633,7 +1623,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', 150, "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', 149, "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>,
@@ -1645,7 +1635,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 151, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 150, "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
@@ -1660,7 +1650,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', 152, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 151, "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
@@ -1672,7 +1662,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', 153, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 152, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1685,7 +1675,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', 154, "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', 153, "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
@@ -1693,13 +1683,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', 155, "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', 154, "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', 156, "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', 155, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1776,7 +1766,6 @@
       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,
@@ -1891,9 +1880,6 @@
 
   @override
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1935,13 +1921,6 @@
    * @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;
 }
 
 /**
@@ -2017,21 +1996,6 @@
    * 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
-   */
-  void reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
-    reportErrorForOffset(errorCode, element.nameOffset, element.displayName.length, arguments);
-  }
-
-  /**
-   * 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
    */
@@ -2043,6 +2007,17 @@
    * 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
+   */
+  void reportErrorForElement(ErrorCode errorCode, Element element, List<Object> arguments) {
+    reportErrorForOffset(errorCode, element.nameOffset, element.displayName.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
    * @param arguments the arguments to the error, used to compose the error message
@@ -2063,24 +2038,6 @@
   }
 
   /**
-   * 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.
    *
@@ -2089,59 +2046,6 @@
   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;
-  }
 }
 
 /**
@@ -2544,9 +2448,6 @@
 
   @override
   ErrorType get type => ErrorType.HINT;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2605,9 +2506,6 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2657,9 +2555,6 @@
 
   @override
   ErrorType get type => ErrorType.POLYMER;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2728,9 +2623,6 @@
 
   @override
   ErrorType get type => ErrorType.PUB_SUGGESTION;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -3078,9 +2970,6 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -4008,9 +3897,6 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -4052,7 +3938,4 @@
 
   @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 b559477..1da03c4 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 HashSet<String>.from(JavaArrays.asList(<String> [
+  static Set<String> SELF_CLOSING = new Set<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 b5b5b10..ae07ab5 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -174,33 +174,6 @@
 }
 
 /**
- * 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> {
@@ -292,11 +265,6 @@
  */
 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
@@ -1595,11 +1563,6 @@
   bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
 
   /**
-   * Removes all of the information.
-   */
-  void clear();
-
-  /**
    * 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
@@ -1987,16 +1950,6 @@
   }
 
   @override
-  void clear() {
-    _canonicalKeys.clear();
-    _keyToLocations.clear();
-    _contextToSourceToKeys.clear();
-    _contextToSourceToLocations.clear();
-    _contextToLibraryToUnits.clear();
-    _contextToUnitToLibraries.clear();
-  }
-
-  @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/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 8ffc875..bac76fa 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -7,7 +7,6 @@
 
 library engine.parser;
 
-import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'instrumentation.dart';
@@ -6065,7 +6064,7 @@
     bool wasInSwitch = _inSwitch;
     _inSwitch = true;
     try {
-      HashSet<String> definedLabels = new HashSet<String>();
+      Set<String> definedLabels = new Set<String>();
       Token keyword = _expectKeyword(Keyword.SWITCH);
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression expression = parseExpression2();
@@ -6571,17 +6570,7 @@
    * Skips a block with all containing blocks.
    */
   void _skipBlock() {
-    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;
-    }
+    _currentToken = (_currentToken as BeginToken).endToken.next;
   }
 
   /**
@@ -7895,9 +7884,6 @@
 
   @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 c12130c..003a977 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -352,22 +352,11 @@
     Element element = annotation.element;
     if (element is ConstructorElement) {
       ConstructorElement constructorElement = element;
-      if (constructorElement.returnType.displayName != name) {
-        return false;
-      }
-      return _isAngularLibraryElement(constructorElement);
+      return constructorElement.returnType.displayName == name;
     }
     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
@@ -921,7 +910,7 @@
     DartType actualBestType = actualPropagatedType != null ? actualPropagatedType : actualStaticType;
     if (actualBestType != null && expectedBestType != null) {
       if (!actualBestType.isAssignableTo(expectedBestType)) {
-        _errorReporter.reportTypeErrorForNode(hintCode, expression, [actualBestType, expectedBestType]);
+        _errorReporter.reportErrorForNode(hintCode, expression, [actualBestType.displayName, expectedBestType.displayName]);
         return true;
       }
     }
@@ -1093,7 +1082,17 @@
     DartType bestRightType = rhs.bestType;
     if (leftType != null && bestRightType != null) {
       if (!bestRightType.isAssignableTo(leftType)) {
-        _errorReporter.reportTypeErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, 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]);
         return true;
       }
     }
@@ -1192,7 +1191,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.isMoreSpecificThan(rhsType)) {
+    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
       return true;
     }
@@ -1437,7 +1436,7 @@
     super.visitMapLiteral(node);
     bool isConst = node.constKeyword != null;
     bool reportEqualKeys = true;
-    HashSet<DartObject> keys = new HashSet<DartObject>();
+    Set<DartObject> keys = new Set<DartObject>();
     List<Expression> invalidKeys = new List<Expression>();
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
@@ -2198,14 +2197,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.
    */
-  HashSet<Element> _allElements = new HashSet<Element>();
+  Set<Element> _allElements = new Set<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.
    */
-  HashSet<Element> _unmatchedElements = new HashSet<Element>();
+  Set<Element> _unmatchedElements = new Set<Element>();
 
   /**
    * Return `true` if the declarations within the given AST structure define an element model
@@ -3354,7 +3353,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.
    */
-  HashMap<String, FieldElement> _fieldMap;
+  Map<String, FieldElement> _fieldMap;
 
   /**
    * Initialize a newly created element builder to build the elements for a compilation unit.
@@ -3988,7 +3987,7 @@
    * @param fields the field elements defined in the current class
    */
   void _buildFieldMap(List<FieldElement> fields) {
-    _fieldMap = new HashMap<String, FieldElement>();
+    _fieldMap = new Map<String, FieldElement>();
     int count = fields.length;
     for (int i = 0; i < count; i++) {
       FieldElement field = fields[i];
@@ -5092,7 +5091,7 @@
         }
         if (classElementContext != null) {
           _subtypeManager.ensureLibraryVisited(_definingLibrary);
-          HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
+          Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
           for (ClassElement subtypeElement in subtypeElements) {
             if (subtypeElement.getMethod(methodName.name) != null) {
               errorCode = null;
@@ -5892,7 +5891,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new HashSet<ClassElement>());
+      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
     }
     return null;
   }
@@ -5909,7 +5908,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, HashSet<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<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
@@ -5965,7 +5964,7 @@
       if (member != null) {
         return member;
       }
-      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new HashSet<ClassElement>());
+      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
     }
     return null;
   }
@@ -5982,7 +5981,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, HashSet<ClassElement> visitedInterfaces) {
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<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
@@ -6087,7 +6086,7 @@
       if (method != null) {
         return method;
       }
-      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
+      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6104,7 +6103,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, HashSet<ClassElement> visitedInterfaces) {
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<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
@@ -6161,7 +6160,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new HashSet<ClassElement>());
+      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
     }
     return null;
   }
@@ -6178,7 +6177,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, HashSet<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<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
@@ -6229,7 +6228,7 @@
   bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
     if (element is ClassElement) {
       _subtypeManager.ensureLibraryVisited(_definingLibrary);
-      HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
+      Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
       for (ClassElement subtypeElement in subtypeElements) {
         if (asMethod && subtypeElement.getMethod(memberName) != null) {
           return true;
@@ -6441,7 +6440,7 @@
   List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
-    HashMap<String, ParameterElement> namedParameters = new HashMap<String, ParameterElement>();
+    Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
     for (ParameterElement parameter in parameters) {
       ParameterKind kind = parameter.parameterKind;
       if (kind == ParameterKind.REQUIRED) {
@@ -6460,7 +6459,7 @@
     int argumentCount = arguments.length;
     List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
     int positionalArgumentCount = 0;
-    HashSet<String> usedNames = new HashSet<String>();
+    Set<String> usedNames = new Set<String>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -6939,7 +6938,7 @@
    * According to the scoping rules these names are hidden, even if they were defined in an outer
    * scope.
    */
-  HashMap<String, Element> _hiddenElements = new HashMap<String, Element>();
+  Map<String, Element> _hiddenElements = new Map<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -7131,11 +7130,6 @@
   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;
@@ -7193,27 +7187,27 @@
    * @see #visitClassDeclaration(ClassDeclaration)
    * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
    */
-  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
+  Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
 
   /**
    * A table mapping name of the library to the export directive which export this library.
    */
-  HashMap<String, LibraryElement> _nameToExportElement = new HashMap<String, LibraryElement>();
+  Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElement>();
 
   /**
    * A table mapping name of the library to the import directive which import this library.
    */
-  HashMap<String, LibraryElement> _nameToImportElement = new HashMap<String, LibraryElement>();
+  Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
 
   /**
    * A table mapping names to the exported elements.
    */
-  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
+  Map<String, Element> _exportedElements = new Map<String, Element>();
 
   /**
    * A set of the names of the variable initializers we are visiting now.
    */
-  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer = new HashSet<String>();
+  Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
 
   /**
    * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
@@ -7391,7 +7385,7 @@
       // initialize initialFieldElementsMap
       if (_enclosingClass != null) {
         List<FieldElement> fieldElements = _enclosingClass.fields;
-        _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
+        _initialFieldElementsMap = new Map<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;
@@ -7459,7 +7453,6 @@
       ConstructorElement constructorElement = node.element;
       _enclosingFunction = constructorElement;
       _isEnclosingConstructorConst = node.constKeyword != null;
-      _isInFactory = node.factoryKeyword != null;
       _checkForConstConstructorWithNonFinalField(node, constructorElement);
       _checkForConstConstructorWithNonConstSuper(node);
       _checkForConflictingConstructorNameAndMember(node, constructorElement);
@@ -7476,7 +7469,6 @@
       return super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
-      _isInFactory = false;
       _enclosingFunction = outerFunction;
     }
   }
@@ -8018,7 +8010,7 @@
       return false;
     }
     bool foundError = false;
-    HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    Map<FieldElement, INIT_STATE> fieldElementsMap = new Map<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
     // Visit all of the field formal parameters
     NodeList<FormalParameter> formalParameters = node.parameters.parameters;
     for (FormalParameter formalParameter in formalParameters) {
@@ -8119,6 +8111,60 @@
       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;
@@ -8164,9 +8210,9 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
     if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportTypeErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
-          overridingFTReturnType,
-          overriddenFTReturnType,
+      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+          overridingFTReturnType.displayName,
+          overriddenFTReturnType.displayName,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
@@ -8177,9 +8223,9 @@
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
       if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportTypeErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingNormalPT[i],
-            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,
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8188,9 +8234,9 @@
     // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
     for (int i = 0; i < overriddenPositionalPT.length; i++) {
       if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingPositionalPT[i],
-            overriddenPositionalPT[i],
+        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingPositionalPT[i].displayName,
+            overriddenPositionalPT[i].displayName,
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8219,9 +8265,9 @@
           }
         }
         if (parameterToSelect != null) {
-          _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
-              overridingType,
-              overriddenNamedPTEntry.getValue(),
+          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
+              overridingType.displayName,
+              overriddenNamedPTEntry.getValue().displayName,
               overriddenExecutable.enclosingElement.displayName]);
           return true;
         }
@@ -8327,20 +8373,25 @@
     //
     // Compute the overridden executable from the InheritanceManager
     //
-    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);
-    }
-    for (ExecutableElement overriddenElement in overriddenExecutables) {
-      if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement, parameters, parameterLocations, errorNameTarget)) {
-        return true;
+    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;
     }
-    return false;
+    //
+    // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
+    //
+    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
   }
 
   /**
@@ -8597,7 +8648,9 @@
     //
     if (actualStaticType != null && expectedStaticType != null) {
       if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        _errorReporter.reportTypeErrorForNode(errorCode, expression, [actualStaticType, expectedStaticType]);
+        _errorReporter.reportErrorForNode(errorCode, expression, [
+            actualStaticType.displayName,
+            expectedStaticType.displayName]);
         return true;
       }
     }
@@ -9034,7 +9087,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;
-    HashMap<String, ClassMember> memberHashMap = new HashMap<String, ClassMember>();
+    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
     for (ClassMember classMember in classMembers) {
       if (classMember is MethodDeclaration) {
         MethodDeclaration method = classMember;
@@ -9500,7 +9553,7 @@
     NodeList<Directive> directives = node.directives;
     int count = directives.length;
     if (count > 0) {
-      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new HashMap<PrefixElement, List<ImportDirective>>();
+      Map<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new Map<PrefixElement, List<ImportDirective>>();
       for (int i = 0; i < count; i++) {
         Directive directive = directives[i];
         if (directive is ImportDirective) {
@@ -9833,9 +9886,9 @@
     }
     // report problem
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportTypeErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
     } else {
-      _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
+      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
     }
     return true;
   }
@@ -9976,7 +10029,7 @@
    * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
    */
   bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
-    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInFactory && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
+    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
       return false;
     }
     // prepare element
@@ -10022,8 +10075,6 @@
     // 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, []);
     }
@@ -10103,7 +10154,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);
-    HashSet<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
     if (errors == null || errors.isEmpty) {
       return false;
     }
@@ -10153,70 +10204,6 @@
   }
 
   /**
-   * 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.
@@ -10268,7 +10255,17 @@
     DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
     DartType staticRightType = getStaticType(rhs);
     if (!staticRightType.isAssignableTo(leftType)) {
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType, 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]);
       return true;
     }
     return false;
@@ -10299,7 +10296,17 @@
       return false;
     }
     if (!rightType.isAssignableTo(leftType)) {
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, 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]);
       return true;
     }
     return false;
@@ -10529,13 +10536,16 @@
     // it is dynamic which is assignable to everything).
     if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
       if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType, getterType]);
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
+            accessorTextName,
+            setterType.displayName,
+            getterType.displayName]);
         return true;
       } else {
-        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
             accessorTextName,
-            setterType,
-            getterType,
+            setterType.displayName,
+            getterType.displayName,
             enclosingClassForCounterpart.displayName]);
       }
     }
@@ -10750,7 +10760,7 @@
         return false;
       }
     }
-    HashSet<ExecutableElement> missingOverrides = new HashSet<ExecutableElement>();
+    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
     //
     // Loop through the set of all executable elements declared in the implicit interface.
     //
@@ -11275,9 +11285,9 @@
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
         return false;
       }
-      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-          staticReturnType,
-          expectedReturnType,
+      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+          staticReturnType.displayName,
+          expectedReturnType.displayName,
           _enclosingFunction.displayName]);
       return true;
     }
@@ -11285,9 +11295,9 @@
     if (isStaticAssignable) {
       return false;
     }
-    _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-        staticReturnType,
-        expectedReturnType,
+    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType.displayName,
+        expectedReturnType.displayName,
         _enclosingFunction.displayName]);
     return true;
   }
@@ -11434,7 +11444,7 @@
           } else {
             errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           }
-          _errorReporter.reportTypeErrorForNode(errorCode, argTypeName, [argType, boundType]);
+          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
           foundError = true;
         }
       }
@@ -11589,7 +11599,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.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType, fieldType]);
+            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
           }
         } else {
           if (fieldElement.isSynthetic) {
@@ -11826,7 +11836,7 @@
    * @return `true` if the given constructor redirects to itself, directly or indirectly
    */
   bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
-    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
+    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
     ConstructorElement current = element;
     while (current != null) {
       if (constructors.contains(current)) {
@@ -11846,7 +11856,7 @@
    *         from anywhere except [ClassElement] or type parameter bounds.
    */
   bool _hasTypedefSelfReference(Element target) {
-    Set<Element> checked = new HashSet<Element>();
+    Set<Element> checked = new Set<Element>();
     List<Element> toCheck = new List<Element>();
     toCheck.add(target);
     bool firstIteration = true;
@@ -12796,7 +12806,7 @@
   /**
    * A set of the libraries that were resolved while resolving the HTML unit.
    */
-  Set<Library> _resolvedLibraries = new HashSet<Library>();
+  Set<Library> _resolvedLibraries = new Set<Library>();
 
   /**
    * Initialize a newly created HTML unit builder.
@@ -13066,7 +13076,7 @@
    * will need to be used to compute the correct [ImportDirective] being used, see
    * [namespaceMap].
    */
-  HashMap<LibraryElement, List<ImportDirective>> _libraryMap;
+  Map<LibraryElement, List<ImportDirective>> _libraryMap;
 
   /**
    * In cases where there is more than one import directive per library element, this mapping is
@@ -13074,7 +13084,7 @@
    * [Namespace] for each of the imports to do lookups in the same way that they are done from
    * the [ElementResolver].
    */
-  HashMap<ImportDirective, Namespace> _namespaceMap;
+  Map<ImportDirective, Namespace> _namespaceMap;
 
   /**
    * This is a map between prefix elements and the import directives from which they are derived. In
@@ -13086,7 +13096,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.
    */
-  HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap;
+  Map<PrefixElement, List<ImportDirective>> _prefixElementMap;
 
   /**
    * Create a new instance of the [ImportsVerifier].
@@ -13097,9 +13107,9 @@
     this._currentLibrary = library;
     this._unusedImports = new List<ImportDirective>();
     this._duplicateImports = new List<ImportDirective>();
-    this._libraryMap = new HashMap<LibraryElement, List<ImportDirective>>();
-    this._namespaceMap = new HashMap<ImportDirective, Namespace>();
-    this._prefixElementMap = new HashMap<PrefixElement, List<ImportDirective>>();
+    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
+    this._namespaceMap = new Map<ImportDirective, Namespace>();
+    this._prefixElementMap = new Map<PrefixElement, List<ImportDirective>>();
   }
 
   /**
@@ -13236,10 +13246,8 @@
     Element element = prefixIdentifier.staticElement;
     if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      if (importDirectives != null) {
-        for (ImportDirective importDirective in importDirectives) {
-          _unusedImports.remove(importDirective);
-        }
+      for (ImportDirective importDirective in importDirectives) {
+        _unusedImports.remove(importDirective);
       }
       return null;
     }
@@ -13314,8 +13322,7 @@
     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) {
@@ -13324,10 +13331,8 @@
       return null;
     } else if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      if (importDirectives != null) {
-        for (ImportDirective importDirective in importDirectives) {
-          _unusedImports.remove(importDirective);
-        }
+      for (ImportDirective importDirective in importDirectives) {
+        _unusedImports.remove(importDirective);
       }
       return null;
     } else if (element.enclosingElement is! CompilationUnitElement) {
@@ -13530,8 +13535,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>
-   * 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
+   * 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
    * <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
@@ -13540,7 +13545,7 @@
   static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
     int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
     int r = _getNumOfRequiredParameters(elementArrayToMerge[0]);
-    Set<String> namedParametersList = new HashSet<String>();
+    Set<String> namedParametersList = new Set<String>();
     for (int i = 1; i < elementArrayToMerge.length; i++) {
       ExecutableElement element = elementArrayToMerge[i];
       int numOfPositionalParams = _getNumOfPositionalParameters(element);
@@ -13553,6 +13558,9 @@
       }
       namedParametersList.addAll(_getNamedParameterNames(element));
     }
+    if (r > h) {
+      return null;
+    }
     return _createSyntheticExecutableElement(elementArrayToMerge, elementArrayToMerge[0].displayName, r, h - r, new List.from(namedParametersList));
   }
 
@@ -13677,19 +13685,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.
    */
-  HashMap<ClassElement, MemberMap> _classLookup;
+  Map<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.
    */
-  HashMap<ClassElement, MemberMap> _interfaceLookup;
+  Map<ClassElement, MemberMap> _interfaceLookup;
 
   /**
    * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
    * the class element.
    */
-  HashMap<ClassElement, HashSet<AnalysisError>> _errorsInClassElement = new HashMap<ClassElement, HashSet<AnalysisError>>();
+  Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassElement, Set<AnalysisError>>();
 
   /**
    * Initialize a newly created inheritance manager.
@@ -13698,8 +13706,8 @@
    */
   InheritanceManager(LibraryElement library) {
     this._library = library;
-    _classLookup = new HashMap<ClassElement, MemberMap>();
-    _interfaceLookup = new HashMap<ClassElement, MemberMap>();
+    _classLookup = new Map<ClassElement, MemberMap>();
+    _interfaceLookup = new Map<ClassElement, MemberMap>();
   }
 
   /**
@@ -13710,7 +13718,7 @@
    * @return the set of [AnalysisError]s found on the passed [ClassElement], or
    *         `null` if there are none
    */
-  HashSet<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
+  Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13720,7 +13728,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 HashSet<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new Set<ClassElement>());
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13730,7 +13738,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 HashSet<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new Set<ClassElement>());
 
   /**
    * Given some [ClassElement] and some member name, this returns the
@@ -13747,9 +13755,9 @@
     if (memberName == null || memberName.isEmpty) {
       return null;
     }
-    ExecutableElement executable = _computeClassChainLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
+    ExecutableElement executable = _computeClassChainLookupMap(classElt, new Set<ClassElement>()).get(memberName);
     if (executable == null) {
-      return _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
+      return _computeInterfaceLookupMap(classElt, new Set<ClassElement>()).get(memberName);
     }
     return executable;
   }
@@ -13792,40 +13800,6 @@
   }
 
   /**
-   * 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
@@ -13878,7 +13852,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, HashSet<ClassElement> visitedClasses) {
+  MemberMap _computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
     MemberMap resultMap = _classLookup[classElt];
     if (resultMap != null) {
       return resultMap;
@@ -14034,37 +14008,13 @@
    * @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, HashSet<ClassElement> visitedInterfaces) {
+  MemberMap _computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
     MemberMap resultMap = _interfaceLookup[classElt];
     if (resultMap != null) {
       return resultMap;
-    }
-    List<MemberMap> lookupMaps = _gatherInterfaceLookupMaps(classElt, visitedInterfaces);
-    if (lookupMaps == null) {
-      resultMap = new MemberMap();
     } else {
-      HashMap<String, List<ExecutableElement>> unionMap = _unionInterfaceLookupMaps(lookupMaps);
-      resultMap = _resolveInheritanceLookup(classElt, unionMap);
+      resultMap = new MemberMap();
     }
-    _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;
@@ -14096,7 +14046,13 @@
           visitedInterfaces.remove(superclassElement);
         }
       } else {
-        return null;
+        MemberMap map = _interfaceLookup[classElt];
+        if (map != null) {
+          lookupMaps.add(map);
+        } else {
+          _interfaceLookup[superclassElement] = resultMap;
+          return resultMap;
+        }
       }
     }
     //
@@ -14127,7 +14083,13 @@
             visitedInterfaces.remove(mixinElement);
           }
         } else {
-          return null;
+          MemberMap map = _interfaceLookup[classElt];
+          if (map != null) {
+            lookupMaps.add(map);
+          } else {
+            _interfaceLookup[mixinElement] = resultMap;
+            return resultMap;
+          }
         }
       }
     }
@@ -14158,99 +14120,70 @@
             visitedInterfaces.remove(interfaceElement);
           }
         } else {
-          return null;
+          MemberMap map = _interfaceLookup[classElt];
+          if (map != null) {
+            lookupMaps.add(map);
+          } else {
+            _interfaceLookup[interfaceElement] = resultMap;
+            return resultMap;
+          }
         }
       }
     }
     if (lookupMaps.length == 0) {
-      return null;
+      _interfaceLookup[classElt] = resultMap;
+      return resultMap;
     }
-    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;
+    //
+    // 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);
+          }
+        }
       }
     }
-    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();
+    //
+    // Loop through the entries in the unionMap, adding them to the resultMap appropriately.
+    //
     for (MapEntry<String, List<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
       String key = entry.getKey();
       List<ExecutableElement> list = entry.getValue();
@@ -14366,7 +14299,9 @@
                 elementArrayToMerge[i] = elements[subtypesOfAllOtherTypesIndexes[i]];
               }
               ExecutableElement mergedExecutableElement = _computeMergedExecutableElement(elementArrayToMerge);
-              resultMap.put(key, mergedExecutableElement);
+              if (mergedExecutableElement != null) {
+                resultMap.put(key, mergedExecutableElement);
+              }
             }
           }
         } else {
@@ -14374,10 +14309,80 @@
         }
       }
     }
+    _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.
    *
@@ -14396,60 +14401,6 @@
       }
     }
   }
-
-  /**
-   * 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;
-  }
 }
 
 /**
@@ -14559,7 +14510,7 @@
   /**
    * A table mapping URI-based directive to the actual URI value.
    */
-  HashMap<UriBasedDirective, String> _directiveUris = new HashMap<UriBasedDirective, String>();
+  Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, String>();
 
   /**
    * A flag indicating whether this library explicitly imports core.
@@ -14575,7 +14526,7 @@
    * A table mapping the sources for the compilation units in this library to their corresponding
    * AST structures.
    */
-  HashMap<Source, ResolvableCompilationUnit> _astMap = new HashMap<Source, ResolvableCompilationUnit>();
+  Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCompilationUnit>();
 
   /**
    * The library scope used when resolving elements within this library's compilation units.
@@ -14675,7 +14626,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<Library> get importsAndExports {
-    HashSet<Library> libraries = new HashSet<Library>();
+    Set<Library> libraries = new Set<Library>();
     for (Library library in _importedLibraries) {
       libraries.add(library);
     }
@@ -15027,7 +14978,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(HashMap<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+  void _collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     for (PropertyAccessorElement accessor in unit.accessors) {
       if (accessor.isGetter) {
         if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
@@ -15088,7 +15039,7 @@
    * @param libraryElement the library defining the compilation units to be processed
    */
   void _patchTopLevelAccessors(LibraryElementImpl libraryElement) {
-    HashMap<String, PropertyAccessorElement> getters = new HashMap<String, PropertyAccessorElement>();
+    Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAccessorElement>();
     List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
     _collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
     for (CompilationUnitElement unit in libraryElement.parts) {
@@ -15297,7 +15248,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
+  Map<Source, Library> _libraryMap = new Map<Source, Library>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -15355,7 +15306,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = createLibrary(_coreLibrarySource);
         if (_coreLibrary == null) {
-          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
+          throw new AnalysisException("Core library does not exist");
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15439,7 +15390,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (_coreLibrary == null) {
-          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
+          throw new AnalysisException("Core library does not exist");
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15521,7 +15472,7 @@
    * @param referencingLibrary the library that references the referenced library
    * @param referencedLibrary the library referenced by the referencing library
    */
-  void _addDependencyToMap(HashMap<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
+  void _addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
     List<Library> dependentLibraries = dependencyMap[referencedLibrary];
     if (dependentLibraries == null) {
       dependentLibraries = new List<Library>();
@@ -15540,7 +15491,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, HashMap<Library, List<Library>> dependencyMap) {
+  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
     if (librariesInCycle.add(library)) {
       List<Library> dependentLibraries = dependencyMap[library];
       if (dependentLibraries != null) {
@@ -15560,7 +15511,7 @@
    * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
    *          recursion
    */
-  void _addToDependencyMap(Library library, HashMap<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
+  void _addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
     if (visitedLibraries.add(library)) {
       for (Library referencedLibrary in library.importsAndExports) {
         _addDependencyToMap(dependencyMap, library, referencedLibrary);
@@ -15605,7 +15556,7 @@
    */
   void _buildDirectiveModels() {
     for (Library library in _librariesInCycles) {
-      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
+      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -15741,9 +15692,9 @@
    *
    * @param library the library currently being added to the dependency map
    */
-  HashMap<Library, List<Library>> _computeDependencyMap(Library library) {
-    HashMap<Library, List<Library>> dependencyMap = new HashMap<Library, List<Library>>();
-    _addToDependencyMap(library, dependencyMap, new HashSet<Library>());
+  Map<Library, List<Library>> _computeDependencyMap(Library library) {
+    Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>();
+    _addToDependencyMap(library, dependencyMap, new Set<Library>());
     return dependencyMap;
   }
 
@@ -15756,8 +15707,8 @@
    */
   void _computeEmbeddedLibraryDependencies(Library library, CompilationUnit unit) {
     Source librarySource = library.librarySource;
-    HashSet<Source> exportedSources = new HashSet<Source>();
-    HashSet<Source> importedSources = new HashSet<Source>();
+    Set<Source> exportedSources = new Set<Source>();
+    Set<Source> importedSources = new Set<Source>();
     for (Directive directive in unit.directives) {
       if (directive is ExportDirective) {
         Source exportSource = _resolveSource(librarySource, directive);
@@ -15783,8 +15734,8 @@
    *         back to the given library
    */
   Set<Library> _computeLibrariesInCycles(Library library) {
-    HashMap<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
-    Set<Library> librariesInCycle = new HashSet<Library>();
+    Map<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
+    Set<Library> librariesInCycle = new Set<Library>();
     _addLibrariesInCycle(library, librariesInCycle, dependencyMap);
     return librariesInCycle;
   }
@@ -16011,18 +15962,6 @@
  */
 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;
@@ -16052,7 +15991,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
+  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -16126,7 +16065,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        missingCoreLibrary(analysisContext, _coreLibrarySource);
+        throw new AnalysisException("Could not resolve dart:core");
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -16193,7 +16132,7 @@
    */
   void _buildDirectiveModels() {
     for (ResolvableLibrary library in _librariesInCycle) {
-      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
+      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -16302,8 +16241,8 @@
     }
   }
 
-  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
-    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
+  Map<Source, ResolvableLibrary> _buildLibraryMap() {
+    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -16676,12 +16615,12 @@
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
    */
-  final HashMap<String, Element> _definedNames;
+  final Map<String, Element> _definedNames;
 
   /**
    * An empty namespace.
    */
-  static Namespace EMPTY = new Namespace(new HashMap<String, Element>());
+  static Namespace EMPTY = new Namespace(new Map<String, Element>());
 
   /**
    * Initialize a newly created namespace to have the given defined names.
@@ -16705,7 +16644,7 @@
    *
    * @return a table containing the same mappings as those defined by this namespace
    */
-  Map<String, Element> get definedNames => new HashMap<String, Element>.from(_definedNames);
+  Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
 }
 
 /**
@@ -16727,7 +16666,7 @@
       //
       return Namespace.EMPTY;
     }
-    HashMap<String, Element> definedNames = _createExportMapping(exportedLibrary, new HashSet<LibraryElement>());
+    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     return new Namespace(definedNames);
   }
@@ -16738,7 +16677,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 HashSet<LibraryElement>()));
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
 
   /**
    * Create a namespace representing the import namespace of the given library.
@@ -16754,7 +16693,7 @@
       //
       return Namespace.EMPTY;
     }
-    HashMap<String, Element> definedNames = _createExportMapping(importedLibrary, new HashSet<LibraryElement>());
+    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     definedNames = _applyPrefix(definedNames, element.prefix);
     return new Namespace(definedNames);
@@ -16767,7 +16706,7 @@
    * @return the public namespace that was created
    */
   Namespace createPublicNamespaceForLibrary(LibraryElement library) {
-    HashMap<String, Element> definedNames = new HashMap<String, Element>();
+    Map<String, Element> definedNames = new Map<String, Element>();
     _addPublicNames(definedNames, library.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in library.parts) {
       _addPublicNames(definedNames, compilationUnit);
@@ -16841,7 +16780,7 @@
    * @param definedNames the mapping table to which the namespace operations are to be applied
    * @param combinators the combinators to be applied
    */
-  HashMap<String, Element> _applyCombinators(HashMap<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
         _hide(definedNames, combinator.hiddenNames);
@@ -16861,10 +16800,10 @@
    * @param definedNames the names that were defined before this operation
    * @param prefixElement the element defining the prefix to be added to the names
    */
-  HashMap<String, Element> _applyPrefix(HashMap<String, Element> definedNames, PrefixElement prefixElement) {
+  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
     if (prefixElement != null) {
       String prefix = prefixElement.name;
-      HashMap<String, Element> newNames = new HashMap<String, Element>();
+      Map<String, Element> newNames = new Map<String, Element>();
       for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
         newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
       }
@@ -16883,17 +16822,17 @@
    *          be added by another library
    * @return the mapping table that was created
    */
-  HashMap<String, Element> _createExportMapping(LibraryElement library, HashSet<LibraryElement> visitedElements) {
+  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
     visitedElements.add(library);
     try {
-      HashMap<String, Element> definedNames = new HashMap<String, Element>();
+      Map<String, Element> definedNames = new Map<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.
           //
-          HashMap<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
+          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
           exportedNames = _applyCombinators(exportedNames, element.combinators);
           _addAllFromMap(definedNames, exportedNames);
         }
@@ -16911,7 +16850,7 @@
    * @param definedNames the names that were defined before this operation
    * @param hiddenNames the names to be hidden
    */
-  void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) {
+  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
     for (String name in hiddenNames) {
       definedNames.remove(name);
       definedNames.remove("${name}=");
@@ -16925,8 +16864,8 @@
    * @param definedNames the names that were defined before this operation
    * @param shownNames the names to be shown
    */
-  HashMap<String, Element> _show(HashMap<String, Element> definedNames, List<String> shownNames) {
-    HashMap<String, Element> newNames = new HashMap<String, Element>();
+  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
+    Map<String, Element> newNames = new Map<String, Element>();
     for (String name in shownNames) {
       Element element = definedNames[name];
       if (element != null) {
@@ -17612,7 +17551,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<ResolvableLibrary> get importsAndExports {
-    HashSet<ResolvableLibrary> libraries = new HashSet<ResolvableLibrary>();
+    Set<ResolvableLibrary> libraries = new Set<ResolvableLibrary>();
     for (ResolvableLibrary library in _importedLibraries) {
       libraries.add(library);
     }
@@ -17785,9 +17724,6 @@
 
   @override
   ErrorSeverity get errorSeverity => type.severity;
-
-  @override
-  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -18227,7 +18163,7 @@
     try {
       super.visitFieldDeclaration(node);
     } finally {
-      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18319,7 +18255,7 @@
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
-    HashMap<Element, DartType> thenOverrides = null;
+    Map<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
       _overrideManager.enterScope();
@@ -18341,7 +18277,7 @@
         _overrideManager.exitScope();
       }
     }
-    HashMap<Element, DartType> elseOverrides = null;
+    Map<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
       _overrideManager.enterScope();
@@ -18490,7 +18426,7 @@
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
+      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18642,15 +18578,14 @@
     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);
     }
   }
@@ -19108,7 +19043,7 @@
    * A table mapping names that are defined in this scope to the element representing the thing
    * declared with that name.
    */
-  HashMap<String, Element> _definedNames = new HashMap<String, Element>();
+  Map<String, Element> _definedNames = new Map<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -20007,8 +19942,8 @@
    *
    * @return the table that was created
    */
-  static HashMap<String, String> _createHtmlTagToClassMap() {
-    HashMap<String, String> map = new HashMap<String, String>();
+  static Map<String, String> _createHtmlTagToClassMap() {
+    Map<String, String> map = new Map<String, String>();
     map["a"] = "AnchorElement";
     map["area"] = "AreaElement";
     map["br"] = "BRElement";
@@ -20104,13 +20039,13 @@
   /**
    * A table mapping [ExecutableElement]s to their propagated return types.
    */
-  HashMap<ExecutableElement, DartType> _propagatedReturnTypes = new HashMap<ExecutableElement, DartType>();
+  Map<ExecutableElement, DartType> _propagatedReturnTypes = new Map<ExecutableElement, DartType>();
 
   /**
    * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
    * those tags.
    */
-  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
+  static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
 
   /**
    * Initialize a newly created type analyzer.
@@ -20873,7 +20808,6 @@
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element staticElement = prefixedIdentifier.staticElement;
     DartType staticType = _dynamicType;
-    DartType propagatedType = null;
     if (staticElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         staticType = staticElement.type;
@@ -20890,7 +20824,6 @@
       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) {
@@ -20901,6 +20834,7 @@
     _recordStaticType(prefixedIdentifier, staticType);
     _recordStaticType(node, staticType);
     Element propagatedElement = prefixedIdentifier.propagatedElement;
+    DartType propagatedType = null;
     if (propagatedElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         propagatedType = propagatedElement.type;
@@ -20913,7 +20847,6 @@
       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) {
@@ -21119,13 +21052,7 @@
     _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 = _getPropertyPropagatedType(element, null);
-    if (propagatedType == null) {
-      DartType overriddenType = _overrideManager.getType(element);
-      if (propagatedType == null || overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType)) {
-        propagatedType = overriddenType;
-      }
-    }
+    DartType propagatedType = _overrideManager.getType(element);
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
       _recordPropagatedType(node, propagatedType);
     }
@@ -21348,7 +21275,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, HashMap<String, String> nameMap) {
+  DartType _getElementNameAsType(LibraryElement library, String elementName, Map<String, String> nameMap) {
     if (elementName != null) {
       if (nameMap != null) {
         elementName = nameMap[elementName.toLowerCase()];
@@ -21436,24 +21363,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 _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;
-  }
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
 
   /**
    * Return the static type of the given expression.
@@ -21668,26 +21578,26 @@
    * A map between [ClassElement]s and a set of [ClassElement]s that are subtypes of the
    * key.
    */
-  HashMap<ClassElement, HashSet<ClassElement>> _subtypeMap = new HashMap<ClassElement, HashSet<ClassElement>>();
+  Map<ClassElement, Set<ClassElement>> _subtypeMap = new Map<ClassElement, Set<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.
    */
-  HashSet<LibraryElement> _visitedLibraries = new HashSet<LibraryElement>();
+  Set<LibraryElement> _visitedLibraries = new Set<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
    */
-  HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) {
+  Set<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
-    HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>();
-    _safelyComputeAllSubtypes(classElement, new HashSet<ClassElement>(), allSubtypes);
+    Set<ClassElement> allSubtypes = new Set<ClassElement>();
+    _safelyComputeAllSubtypes(classElement, new Set<ClassElement>(), allSubtypes);
     return allSubtypes;
   }
 
@@ -21780,9 +21690,9 @@
    * @param subtypeElement the value for the [subtypeMap] map
    */
   void _putInSubtypeMap(ClassElement supertypeElement, ClassElement subtypeElement) {
-    HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement];
+    Set<ClassElement> subtypes = _subtypeMap[supertypeElement];
     if (subtypes == null) {
-      subtypes = new HashSet<ClassElement>();
+      subtypes = new Set<ClassElement>();
       _subtypeMap[supertypeElement] = subtypes;
     }
     subtypes.add(subtypeElement);
@@ -21796,12 +21706,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, HashSet<ClassElement> visitedClasses, HashSet<ClassElement> allSubtypes) {
+  void _safelyComputeAllSubtypes(ClassElement classElement, Set<ClassElement> visitedClasses, Set<ClassElement> allSubtypes) {
     if (!visitedClasses.add(classElement)) {
       // if this class has already been called on this class element
       return;
     }
-    HashSet<ClassElement> subtypes = _subtypeMap[classElement];
+    Set<ClassElement> subtypes = _subtypeMap[classElement];
     if (subtypes == null) {
       return;
     }
@@ -21887,7 +21797,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(HashMap<Element, DartType> overrides) {
+  void applyOverrides(Map<Element, DartType> overrides) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot apply overrides without a scope");
     }
@@ -21900,7 +21810,7 @@
    *
    * @return the overrides in the current scope
    */
-  HashMap<Element, DartType> captureLocalOverrides() {
+  Map<Element, DartType> captureLocalOverrides() {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture local overrides without a scope");
     }
@@ -21914,7 +21824,7 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture overrides without a scope");
     }
@@ -21979,7 +21889,7 @@
   /**
    * A table mapping elements to the overridden type of that element.
    */
-  HashMap<Element, DartType> _overridenTypes = new HashMap<Element, DartType>();
+  Map<Element, DartType> _overridenTypes = new Map<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -21993,7 +21903,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(HashMap<Element, DartType> overrides) {
+  void applyOverrides(Map<Element, DartType> overrides) {
     for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
@@ -22005,7 +21915,7 @@
    *
    * @return the overrides in the current scope
    */
-  HashMap<Element, DartType> captureLocalOverrides() => _overridenTypes;
+  Map<Element, DartType> captureLocalOverrides() => _overridenTypes;
 
   /**
    * Return a map from the elements for the variables in the given list that have their types
@@ -22014,8 +21924,8 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
-    HashMap<Element, DartType> overrides = new HashMap<Element, DartType>();
+  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+    Map<Element, DartType> overrides = new Map<Element, DartType>();
     if (variableList.isConst || variableList.isFinal) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
@@ -22147,7 +22057,7 @@
   /**
    * A table mapping elements to the promoted type of that element.
    */
-  HashMap<Element, DartType> _promotedTypes = new HashMap<Element, DartType>();
+  Map<Element, DartType> _promotedTypes = new Map<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 2d50d11..0153b3c 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));
-        next = _tokenizeStringInterpolation(start);
         _beginToken();
+        next = _tokenizeStringInterpolation(start);
         start = _reader.offset;
         continue;
       }
@@ -1678,11 +1678,7 @@
       }
     }
     _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    if (start == _reader.offset) {
-      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
-    } else {
-      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
-    }
+    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
     return _reader.advance();
   }
 
@@ -1754,7 +1750,7 @@
         return _reader.advance();
       } else if (next == 0xD || next == 0xA) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1770,20 +1766,14 @@
         next = _reader.advance();
       } else if (next == 0x24) {
         _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        next = _tokenizeStringInterpolation(start);
         _beginToken();
+        next = _tokenizeStringInterpolation(start);
         start = _reader.offset;
         continue;
       }
       if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        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));
-        }
+        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1921,9 +1911,6 @@
 
   @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 84ccc2d..4a60af2 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -7,7 +7,6 @@
 
 library engine.sdk;
 
-import 'dart:collection';
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'ast.dart';
 import 'engine.dart' show AnalysisContext;
@@ -102,7 +101,7 @@
   /**
    * A table mapping Dart library URI's to the library.
    */
-  HashMap<String, SdkLibraryImpl> _libraryMap = new HashMap<String, SdkLibraryImpl>();
+  Map<String, SdkLibraryImpl> _libraryMap = new Map<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 3022961..3e41f46 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -7,7 +7,6 @@
 
 library engine.source;
 
-import 'dart:collection';
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext, TimestampedData;
@@ -21,13 +20,13 @@
    * A table mapping sources to the contents of those sources. This is used to override the default
    * contents of a source.
    */
-  HashMap<Source, String> _contentMap = new HashMap<Source, String>();
+  Map<Source, String> _contentMap = new Map<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.
    */
-  HashMap<Source, int> _stampMap = new HashMap<Source, int>();
+  Map<Source, int> _stampMap = new Map<Source, int>();
 
   /**
    * Return the contents of the given source, or `null` if this cache does not override the
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index f89d69f..0ba35d3 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -7,7 +7,6 @@
 
 library engine.utilities.collection;
 
-import 'dart:collection';
 import 'java_core.dart';
 import 'scanner.dart' show Token;
 
@@ -95,7 +94,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.
    */
-  HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>();
+  Map<N, Set<N>> _edges = new Map<N, Set<N>>();
 
   /**
    * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
@@ -109,14 +108,14 @@
     // First, ensure that the tail is a node known to the graph.
     //
     if (_edges[tail] == null) {
-      _edges[tail] = new HashSet<N>();
+      _edges[tail] = new Set<N>();
     }
     //
     // Then create the edge.
     //
-    HashSet<N> tails = _edges[head];
+    Set<N> tails = _edges[head];
     if (tails == null) {
-      tails = new HashSet<N>();
+      tails = new Set<N>();
       _edges[head] = tails;
     }
     tails.add(tail);
@@ -128,9 +127,9 @@
    * @param node the node to be added
    */
   void addNode(N node) {
-    HashSet<N> tails = _edges[node];
+    Set<N> tails = _edges[node];
     if (tails == null) {
-      _edges[node] = new HashSet<N>();
+      _edges[node] = new Set<N>();
     }
   }
 
@@ -149,7 +148,7 @@
    * Return true if the graph contains at least one path from `source` to `destination`.
    */
   bool containsPath(N source, N destination) {
-    HashSet<N> nodesVisited = new HashSet<N>();
+    Set<N> nodesVisited = new Set<N>();
     return _containsPathInternal(source, destination, nodesVisited);
   }
 
@@ -188,9 +187,9 @@
    * @return a set containing the tails of edges that have the given node as their head
    */
   Set<N> getTails(N head) {
-    HashSet<N> tails = _edges[head];
+    Set<N> tails = _edges[head];
     if (tails == null) {
-      return new HashSet<N>();
+      return new Set<N>();
     }
     return tails;
   }
@@ -224,7 +223,7 @@
    * @return `true` if the graph was modified as a result of this operation
    */
   void removeEdge(N head, N tail) {
-    HashSet<N> tails = _edges[head];
+    Set<N> tails = _edges[head];
     if (tails != null) {
       tails.remove(tail);
     }
@@ -238,7 +237,7 @@
    */
   void removeNode(N node) {
     _edges.remove(node);
-    for (HashSet<N> tails in _edges.values) {
+    for (Set<N> tails in _edges.values) {
       tails.remove(node);
     }
   }
@@ -261,11 +260,11 @@
     return sink;
   }
 
-  bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) {
+  bool _containsPathInternal(N source, N destination, Set<N> nodesVisited) {
     if (identical(source, destination)) {
       return true;
     }
-    HashSet<N> tails = _edges[source];
+    Set<N> tails = _edges[source];
     if (tails != null) {
       nodesVisited.add(source);
       for (N tail in tails) {
@@ -356,7 +355,7 @@
   /**
    * A table mapping nodes to information about the nodes that is used by this algorithm.
    */
-  HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = new HashMap<N, DirectedGraph_NodeInfo<N>>();
+  Map<N, DirectedGraph_NodeInfo<N>> _nodeMap = new Map<N, DirectedGraph_NodeInfo<N>>();
 
   /**
    * A list of all strongly connected components found, in topological sort order (each node in a
@@ -433,7 +432,7 @@
     //
     // Consider successors of v
     //
-    HashSet<N> tails = _graph._edges[v];
+    Set<N> tails = _graph._edges[v];
     if (tails != null) {
       for (N w in tails) {
         DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
@@ -639,7 +638,7 @@
    * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
    * cursor indicating where to start searching.
    */
-  HashMap<Token, Token> _map = new HashMap<Token, Token>();
+  Map<Token, Token> _map = new Map<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 588464d..cfa81c9 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -425,6 +425,7 @@
     token(node.leftParenthesis);
     breakableNonSpace();
     visitCommaSeparatedNodes(node.arguments);
+    breakableNonSpace();
     token(node.rightParenthesis);
   }
 
@@ -807,8 +808,7 @@
     for (var i = 0; i < size; i++) {
       var parameter = parameters[i];
       if (i > 0) {
-        append(',');
-        space();
+        append(', ');
       }
       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);
+    visitNode(node.typeArguments, followedBy: space);
     token(node.leftBracket);
     if (!node.entries.isEmpty) {
       newlines();
@@ -1061,7 +1061,7 @@
     if (!node.isGetter) {
       visit(node.parameters);
     }
-    visitPrefixedBody(nonBreakingSpace, node.body);
+    visitPrefixedBody(space, node.body);
   }
 
   visitMethodInvocation(MethodInvocation node) {
@@ -1180,7 +1180,7 @@
   visitSimpleFormalParameter(SimpleFormalParameter node) {
     visitMemberMetadata(node.metadata);
     modifier(node.keyword);
-    visitNode(node.type, followedBy: nonBreakingSpace);
+    visitNode(node.type, followedBy: space);
     visit(node.identifier);
   }
 
@@ -1686,10 +1686,6 @@
   }
 
 
-  /// 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) &&
@@ -1705,11 +1701,6 @@
       }
     }
 
-    // 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 cf0dd74..4e8cef5 100644
--- a/pkg/analyzer/lib/src/services/writer.dart
+++ b/pkg/analyzer/lib/src/services/writer.dart
@@ -33,10 +33,6 @@
     tokens.add(token);
   }
 
-  void clear() {
-    tokens.clear();
-  }
-
   bool isEmpty() => tokens.isEmpty;
 
   bool isWhitespace() => tokens.every(
@@ -350,18 +346,8 @@
     }
   }
 
-  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 write(x) {
+    _addToken(new LineToken(x));
   }
 
   void writeln(String s) {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 424ea2b8..caa0f1c 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.15.7
+version: 0.15.6-dev
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 3bcb073..e6c2fc3 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -3269,16 +3269,6 @@
     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));
@@ -3402,16 +3392,6 @@
     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, []);
@@ -4120,10 +4100,6 @@
         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);
@@ -4164,10 +4140,6 @@
         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 6ad74bc..7d1c72b 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -7661,12 +7661,6 @@
     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], "{ {} }");
@@ -11001,10 +10995,6 @@
         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 943328c..b59d1e9 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -7,7 +7,6 @@
 
 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';
@@ -180,7 +179,7 @@
     htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
-    HashMap<Source, LibraryElement> elementMap = new HashMap<Source, LibraryElement>();
+    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
     elementMap[asyncSource] = asyncLibrary;
     elementMap[htmlSource] = htmlLibrary;
@@ -2057,36 +2056,6 @@
     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 {",
@@ -4745,14 +4714,6 @@
         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);
@@ -9243,66 +9204,9 @@
     _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();
-    HashSet<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
+    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
     if (actualErrors != null) {
       for (AnalysisError error in actualErrors) {
         errorListener.onError(error);
@@ -9548,22 +9452,6 @@
         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);
-      });
     });
   }
 }
@@ -16073,19 +15961,6 @@
     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);
@@ -16384,10 +16259,6 @@
         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);
@@ -18699,7 +18570,7 @@
     _analyze5(p1);
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p1"] = dynamicType;
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
@@ -18714,7 +18585,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18757,7 +18628,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18773,7 +18644,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -21695,6 +21566,58 @@
 }
 
 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);
@@ -22939,22 +22862,6 @@
     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 {",
@@ -23027,23 +22934,6 @@
     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 {",
@@ -23325,22 +23215,6 @@
     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);
@@ -24897,10 +24771,6 @@
         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);
@@ -24921,10 +24791,6 @@
         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);
@@ -25005,10 +24871,6 @@
         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);
@@ -25665,7 +25527,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(2, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
@@ -25685,9 +25547,9 @@
     ClassElementImpl classD = ElementFactory.classElement("D", classB.type, []);
     ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB, classC, classD, classE];
-    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    HashSet<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
+    Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
     List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
     EngineTestCase.assertSizeOfSet(4, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
@@ -25701,7 +25563,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
-    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     EngineTestCase.assertSizeOfSet(0, subtypesOfA);
   }
 
@@ -25713,7 +25575,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(1, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
@@ -26385,124 +26247,6 @@
     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() {",
@@ -27273,30 +27017,6 @@
         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);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index fabe810..575fcac 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -1287,23 +1287,7 @@
   }
 
   void test_string_multi_unterminated() {
-    _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)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
   }
 
   void test_string_raw_multi_double() {
@@ -1315,8 +1299,7 @@
   }
 
   void test_string_raw_multi_unterminated() {
-    String source = "r'''string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, source, [new StringToken(TokenType.STRING, source, 0)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
   }
 
   void test_string_raw_simple_double() {
@@ -1328,13 +1311,11 @@
   }
 
   void test_string_raw_simple_unterminated_eof() {
-    String source = "r'string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, source, [new StringToken(TokenType.STRING, source, 0)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
   }
 
   void test_string_raw_simple_unterminated_eol() {
-    String source = "r'string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "${source}\n", [new StringToken(TokenType.STRING, source, 0)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
   }
 
   void test_string_simple_double() {
@@ -1422,29 +1403,11 @@
   }
 
   void test_string_simple_unterminated_eof() {
-    String source = "'string";
-    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, source, [new StringToken(TokenType.STRING, source, 0)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
   }
 
   void test_string_simple_unterminated_eol() {
-    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)]);
+    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
   }
 
   void test_tilde() {
@@ -1494,8 +1457,8 @@
   /**
    * Assert that scanning the given source produces an error with the given code.
    *
-   * @param expectedError the error that should be produced
-   * @param expectedOffset the string offset that should be associated with the error
+   * @param illegalCharacter
+   * @param i
    * @param source the source to be scanned to produce the error
    */
   void _assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
@@ -2217,14 +2180,6 @@
         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);
@@ -2301,14 +2256,6 @@
         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 382b42f..fe7f86b 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -7,7 +7,6 @@
 
 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';
@@ -454,7 +453,7 @@
   /**
    * A table mapping sources to the line information for the source.
    */
-  HashMap<Source, LineInfo> _lineInfoMap = new HashMap<Source, LineInfo>();
+  Map<Source, LineInfo> _lineInfoMap = new Map<Source, LineInfo>();
 
   /**
    * An empty array of errors used when no errors are expected.
@@ -537,7 +536,7 @@
     //
     // Compute the expected number of each type of error.
     //
-    HashMap<ErrorCode, int> expectedCounts = new HashMap<ErrorCode, int>();
+    Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
     for (ErrorCode code in expectedErrorCodes) {
       int count = expectedCounts[code];
       if (count == null) {
@@ -550,7 +549,7 @@
     //
     // Compute the actual number of each type of error.
     //
-    HashMap<ErrorCode, List<AnalysisError>> errorsByCode = new HashMap<ErrorCode, List<AnalysisError>>();
+    Map<ErrorCode, List<AnalysisError>> errorsByCode = new Map<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 06dddef..d6186df 100644
--- a/pkg/analyzer/test/services/data/cu_tests.data
+++ b/pkg/analyzer/test/services/data/cu_tests.data
@@ -274,36 +274,4 @@
 >>>
 import 'a.dart' deferred as a;
 <<<
-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);
-}
+import 'a.dart' deferred as a;
\ No newline at end of file
diff --git a/pkg/analyzer/test/services/data/stmt_tests.data b/pkg/analyzer/test/services/data/stmt_tests.data
index 3143fe1..006ca41 100644
--- a/pkg/analyzer/test/services/data/stmt_tests.data
+++ b/pkg/analyzer/test/services/data/stmt_tests.data
@@ -190,15 +190,4 @@
     zero = 2;
   }
   print(0);
-}
->>>
-main() {
-  f(a, b) {}
-  f(0000000000000000000000000000000000000000000000000000000000000000000000, 111);
-}
-<<<
-main() {
-  f(a, b) {}
-  f(0000000000000000000000000000000000000000000000000000000000000000000000,
-      111);
-}
+}
\ No newline at end of file
diff --git a/pkg/analyzer/test/services/data/style_guide_tests.data b/pkg/analyzer/test/services/data/style_guide_tests.data
index d059c38..781516d 100644
--- a/pkg/analyzer/test/services/data/style_guide_tests.data
+++ b/pkg/analyzer/test/services/data/style_guide_tests.data
@@ -153,12 +153,10 @@
 >>> 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 5298d73..85e68aa 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -184,30 +184,6 @@
           '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', () {
@@ -1000,51 +976,6 @@
                           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)', () {
@@ -1311,15 +1242,6 @@
       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/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
new file mode 100644
index 0000000..df37f7b
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_impl.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library for code coverage support for Dart.
+library runtime.coverage_impl;
+
+import "dart:io";
+
+import "package:logging/logging.dart" as log;
+import "package:pathos/path.dart" as po;
+
+import 'package:analyzer_experimental/src/generated/source.dart' show Source;
+import 'package:analyzer_experimental/src/generated/scanner.dart' show StringScanner;
+import 'package:analyzer_experimental/src/generated/parser.dart' show Parser;
+import 'package:analyzer_experimental/src/generated/ast.dart';
+import 'package:analyzer_experimental/src/generated/engine.dart' show RecordingErrorListener;
+
+
+log.Logger logger = log.Logger.root;
+
+/// Abstract server that listens requests and serves files, may be rewriting them.
+abstract class RewriteServer {
+  String _basePath;
+  RewriteServer(this._basePath);
+  void start() {
+    HttpServer.bind("127.0.0.1", 3445).then((HttpServer server) {
+      logger.info('RewriteServer is listening at: ${server.port}.');
+      server.listen((HttpRequest request) {
+        var response = request.response;
+        // Prepare path.
+        var path = _basePath + '/' + request.uri.path;
+        path = po.normalize(path);
+        logger.info('[$path] Requested.');
+        // May be serve using just path.
+        {
+          String content = rewritePathContent(path);
+          if (content != null) {
+            logger.info('[$path] Request served by path.');
+            response.write(content);
+            response.close();
+            return;
+          }
+        }
+        // Serve from file.
+        logger.info('[$path] Serving file.');
+        var file = new File(path);
+        file.exists().then((bool found) {
+          if (found) {
+            logger.finest('[$path] Found file.');
+            file.readAsString().then((String content) {
+              logger.finest('[$path] Got file content.');
+              var sw = new Stopwatch();
+              sw.start();
+              try {
+                content = rewriteFileContent(path, content);
+              } finally {
+                sw.stop();
+                logger.fine('[$path] Rewritten in ${sw.elapsedMilliseconds} ms.');
+              }
+              response.write(content);
+              response.close();
+            });
+          } else {
+            logger.severe('[$path] File not found.');
+            response.statusCode = HttpStatus.NOT_FOUND;
+            response.close();
+          }
+        });
+      });
+    });
+  }
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  /// Returns some content or `null` if file content should be requested.
+  String rewritePathContent(String path);
+
+  /// Subclasses implement this method to rewrite the provided [code] of the file with [path].
+  String rewriteFileContent(String path, String code);
+}
+
+/// Server that rewrites Dart code so that it reports execution of statements and other nodes.
+class CoverageServer extends RewriteServer {
+  CoverageServer(String basePath) : super(basePath);
+
+  String rewritePathContent(String path) {
+    if (path.endsWith('__coverage_impl.dart')) {
+      String implPath = po.joinAll([
+          po.dirname(new Options().script),
+          '..', 'lib', 'src', 'services', 'runtime', 'coverage_lib.dart']);
+      return new File(implPath).readAsStringSync();
+    }
+    return null;
+  }
+
+  String rewriteFileContent(String path, String code) {
+    if (po.extension(path).toLowerCase() != '.dart') return code;
+    if (path.contains('packages')) return code;
+    var unit = _parseCode(code);
+    var injector = new StringInjector(code);
+    // Inject coverage library import.
+    var directives = unit.directives;
+    if (directives.isNotEmpty && directives[0] is LibraryDirective) {
+      injector.inject(directives[0].end, 'import "__coverage_impl.dart" as __cc;');
+    } else {
+      throw new Exception('Only single library coverage is implemented.');
+    }
+    // Insert touch() invocations.
+    unit.accept(new InsertTouchInvocationsVisitor(injector));
+    // Done.
+    code = injector.code;
+    logger.finest('[$path] Rewritten content\n$code');
+    return code;
+  }
+
+  CompilationUnit _parseCode(String code) {
+    var source = null;
+    var errorListener = new RecordingErrorListener();
+    var parser = new Parser(source, errorListener);
+    var scanner = new StringScanner(source, code, errorListener);
+    var token = scanner.tokenize();
+    return parser.parseCompilationUnit(token);
+  }
+}
+
+/// The visitor that inserts `touch` method invocations.
+class InsertTouchInvocationsVisitor extends GeneralizingASTVisitor {
+  StringInjector injector;
+  InsertTouchInvocationsVisitor(this.injector);
+  visitStatement(Statement node) {
+    super.visitStatement(node);
+    var offset = node.end;
+    if (node is Block) {
+      offset--;
+    }
+    if (node is Block && node.parent is BlockFunctionBody) return null;
+    injector.inject(offset, '__cc.touch(${node.offset});');
+    return null;
+  }
+}
+
+/// Helper for injecting fragments into some existing [String].
+class StringInjector {
+  String code;
+  int _lastOffset = -1;
+  int _delta = 0;
+  StringInjector(this.code);
+  void inject(int offset, String fragment) {
+    if (offset < _lastOffset) {
+      throw new ArgumentError('Only forward inserts are supported, was $_lastOffset given $offset');
+    }
+    _lastOffset = offset;
+    offset += _delta;
+    code = code.substring(0, offset) + fragment + code.substring(offset);
+    _delta += fragment.length;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
new file mode 100644
index 0000000..945b38f
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/services/runtime/coverage_lib.dart
@@ -0,0 +1,11 @@
+// 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 is injected into the applications under coverage.
+library coverage_lib;
+
+/// Notifies that the object with the given [id] - statement, token, etc was executed.
+touch(int id) {
+  print('touch: $id');
+}
diff --git a/pkg/analyzer_experimental/lib/src/utils.dart b/pkg/analyzer_experimental/lib/src/utils.dart
new file mode 100644
index 0000000..2b5053e
--- /dev/null
+++ b/pkg/analyzer_experimental/lib/src/utils.dart
@@ -0,0 +1,22 @@
+// 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 utils;
+
+import 'dart:io';
+
+import 'package:pathos/path.dart' as pathos;
+
+/// Converts a local path string to a `file:` [Uri].
+Uri pathToFileUri(String pathString) {
+  pathString = pathos.absolute(pathString);
+  if (Platform.operatingSystem != 'windows') {
+    return Uri.parse('file://$pathString');
+  } else if (pathos.rootPrefix(pathString).startsWith('\\\\')) {
+    // Network paths become "file://hostname/path/to/file".
+    return Uri.parse('file:${pathString.replaceAll("\\", "/")}');
+  } else {
+    // Drive-letter paths become "file:///C:/path/to/file".
+    return Uri.parse('file:///${pathString.replaceAll("\\", "/")}');
+  }
+}
diff --git a/pkg/code_transformers/lib/src/dart_sdk.dart b/pkg/code_transformers/lib/src/dart_sdk.dart
index 3438218..7b6f8e6 100644
--- a/pkg/code_transformers/lib/src/dart_sdk.dart
+++ b/pkg/code_transformers/lib/src/dart_sdk.dart
@@ -7,11 +7,6 @@
 import 'dart:convert' as convert;
 import 'dart:io' show File, Platform, Process;
 import 'package:path/path.dart' as path;
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_io.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
-import 'package:analyzer/src/generated/source.dart';
 
 
 /// Attempts to provide the current Dart SDK directory.
@@ -52,163 +47,3 @@
 
   return null;
 }
-
-/// Sources that are annotated with a source uri, so it is easy to resolve how
-/// to support `Resolver.getImportUri`.
-abstract class UriAnnotatedSource extends Source {
-  Uri get uri;
-}
-
-/// Dart SDK which wraps all Dart sources as [UriAnnotatedSource] to ensure they
-/// are tracked with Uris.
-class DirectoryBasedDartSdkProxy extends DirectoryBasedDartSdk {
-  DirectoryBasedDartSdkProxy(String sdkDirectory)
-      : super(new JavaFile(sdkDirectory));
-
-  Source mapDartUri(String dartUri) =>
-      DartSourceProxy.wrap(super.mapDartUri(dartUri), Uri.parse(dartUri));
-}
-
-/// Dart SDK resolver which wraps all Dart sources to ensure they are tracked
-/// with URIs.
-class DartUriResolverProxy implements DartUriResolver {
-  final DartUriResolver _proxy;
-  DartUriResolverProxy(DartSdk sdk) :
-      _proxy = new DartUriResolver(sdk);
-
-  Source resolveAbsolute(Uri uri) =>
-    DartSourceProxy.wrap(_proxy.resolveAbsolute(uri), uri);
-
-  DartSdk get dartSdk => _proxy.dartSdk;
-
-  Source fromEncoding(UriKind kind, Uri uri) =>
-      throw new UnsupportedError('fromEncoding is not supported');
-
-  Uri restoreAbsolute(Source source) =>
-      throw new UnsupportedError('restoreAbsolute is not supported');
-}
-
-/// Source file for dart: sources which track the sources with dart: URIs.
-///
-/// This is primarily to support [Resolver.getImportUri] for Dart SDK (dart:)
-/// based libraries.
-class DartSourceProxy implements UriAnnotatedSource {
-
-  /// Absolute URI which this source can be imported from
-  final Uri uri;
-
-  /// Underlying source object.
-  final Source _proxy;
-
-  DartSourceProxy(this._proxy, this.uri);
-
-  /// Ensures that [source] is a DartSourceProxy.
-  static DartSourceProxy wrap(Source source, Uri uri) {
-    if (source == null || source is DartSourceProxy) return source;
-    return new DartSourceProxy(source, uri);
-  }
-
-  Source resolveRelative(Uri relativeUri) {
-    // Assume that the type can be accessed via this URI, since these
-    // should only be parts for dart core files.
-    return wrap(_proxy.resolveRelative(relativeUri), uri);
-  }
-
-  bool exists() => _proxy.exists();
-
-  bool operator ==(Object other) =>
-    (other is DartSourceProxy && _proxy == other._proxy);
-
-  int get hashCode => _proxy.hashCode;
-
-  TimestampedData<String> get contents => _proxy.contents;
-
-  String get encoding => _proxy.encoding;
-
-  String get fullName => _proxy.fullName;
-
-  int get modificationStamp => _proxy.modificationStamp;
-
-  String get shortName => _proxy.shortName;
-
-  UriKind get uriKind => _proxy.uriKind;
-
-  bool get isInSystemLibrary => _proxy.isInSystemLibrary;
-}
-
-
-/// Dart SDK which contains a mock implementation of the SDK libraries. May be
-/// used to speed up resultion when most of the core libraries is not needed.
-class MockDartSdk implements DartSdk {
-  final Map<Uri, _MockSdkSource> _sources = {};
-  final bool reportMissing;
-  final Map<String, SdkLibrary> _libs = {};
-  final String sdkVersion = '0';
-  List<String> get uris => _sources.keys.map((uri) => '$uri').toList();
-  final AnalysisContext context = new SdkAnalysisContext();
-  DartUriResolver _resolver;
-  DartUriResolver get resolver => _resolver;
-
-  MockDartSdk(Map<String, String> sources, {this.reportMissing}) {
-    sources.forEach((uriString, contents) {
-      var uri = Uri.parse(uriString);
-      _sources[uri] = new _MockSdkSource(uri, contents);
-      _libs[uriString] = new SdkLibraryImpl(uri.path)
-        ..setDart2JsLibrary()
-        ..setVmLibrary();
-    });
-    _resolver = new DartUriResolver(this);
-    context.sourceFactory = new SourceFactory([_resolver]);
-  }
-
-  List<SdkLibrary> get sdkLibraries => _libs.values.toList();
-  SdkLibrary getSdkLibrary(String dartUri) => _libs[dartUri];
-  Source mapDartUri(String dartUri) => _getSource(Uri.parse(dartUri));
-
-  Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind != UriKind.DART_URI) {
-      throw new UnsupportedError('expected dart: uri kind, got $kind.');
-    }
-    return _getSource(uri);
-  }
-
-  Source _getSource(Uri uri) {
-    var src = _sources[uri];
-    if (src == null) {
-      if (reportMissing) print('warning: missing mock for $uri.');
-      _sources[uri] = src =
-          new _MockSdkSource(uri, 'library dart.${uri.path};');
-    }
-    return src;
-  }
-}
-
-class _MockSdkSource implements UriAnnotatedSource {
-  /// Absolute URI which this source can be imported from.
-  final Uri uri;
-  final String _contents;
-
-  _MockSdkSource(this.uri, this._contents);
-
-  bool exists() => true;
-
-  int get hashCode => uri.hashCode;
-
-  final int modificationStamp = 1;
-
-  TimestampedData<String> get contents =>
-      new TimestampedData(modificationStamp, _contents);
-
-  String get encoding => "${uriKind.encoding}$uri";
-
-  String get fullName => shortName;
-
-  String get shortName => uri.path;
-
-  UriKind get uriKind => UriKind.DART_URI;
-
-  bool get isInSystemLibrary => true;
-
-  Source resolveRelative(Uri relativeUri) =>
-      throw new UnsupportedError('not expecting relative urls in dart: mocks');
-}
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 3df7a80..10e323c 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -5,13 +5,15 @@
 library code_transformer.src.resolver_impl;
 
 import 'dart:async';
-import 'package:analyzer/analyzer.dart' show parseDirectives;
+import 'package:analyzer/analyzer.dart' show parseCompilationUnit;
 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator;
 import 'package:analyzer/src/generated/constant.dart' show ConstantEvaluator,
        EvaluationResult;
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
@@ -20,7 +22,6 @@
 import 'package:source_maps/span.dart' show SourceFile, Span;
 
 import 'resolver.dart';
-import 'dart_sdk.dart' show UriAnnotatedSource;
 
 // We should always be using url paths here since it's always Dart/pub code.
 final path = native_path.url;
@@ -50,10 +51,12 @@
   /// Completer for wrapping up the current phase.
   Completer _currentPhaseComplete;
 
-  /// Creates a resolver with a given [sdk] implementation for resolving
-  /// `dart:*` imports.
-  ResolverImpl(DartSdk sdk, DartUriResolver dartUriResolver,
-      {AnalysisOptions options}) {
+  /// Handler for all Dart SDK (dart:) sources.
+  DirectoryBasedDartSdk _dartSdk;
+
+  /// Creates a resolver, where [sdkDir] is the root directory of the Dart SDK,
+  /// for resolving `dart:*` imports.
+  ResolverImpl(String sdkDir, {AnalysisOptions options}) {
     if (options == null) {
       options = new AnalysisOptionsImpl()
         ..cacheSize = 256 // # of sources to cache ASTs for.
@@ -61,8 +64,12 @@
         ..analyzeFunctionBodies = true;
     }
     _context.analysisOptions = options;
-    sdk.context.analysisOptions = options;
-    _context.sourceFactory = new SourceFactory([dartUriResolver,
+
+    _dartSdk = new _DirectoryBasedDartSdkProxy(new JavaFile(sdkDir));
+    _dartSdk.context.analysisOptions = options;
+
+    _context.sourceFactory = new SourceFactory([
+        new DartUriResolverProxy(_dartSdk),
         new _AssetUriResolver(this)]);
   }
 
@@ -241,7 +248,7 @@
     var source = element.source;
     if (source is _AssetBasedSource) {
       return source.getSourceUri(from);
-    } else if (source is UriAnnotatedSource) {
+    } else if (source is _DartSourceProxy) {
       return source.uri;
     }
     // Should not be able to encounter any other source types.
@@ -313,7 +320,7 @@
   /// any analyzer resolution.
   void updateDependencies(String contents) {
     if (contents == _contents) return;
-    var unit = parseDirectives(contents, suppressErrors: true);
+    var unit = parseCompilationUnit(contents, suppressErrors: true);
     _dependentAssets = unit.directives
         .where((d) => (d is ImportDirective || d is PartDirective ||
             d is ExportDirective))
@@ -446,6 +453,86 @@
   TransformLogger get logger => _resolver._currentTransform.logger;
 }
 
+
+/// Dart SDK which wraps all Dart sources to ensure they are tracked with Uris.
+///
+/// Just a simple wrapper to make it easy to make sure that all sources we
+/// encounter are either _AssetBasedSource or _DartSourceProxy.
+class _DirectoryBasedDartSdkProxy extends DirectoryBasedDartSdk {
+  _DirectoryBasedDartSdkProxy(JavaFile sdkDirectory) : super(sdkDirectory);
+
+  Source mapDartUri(String dartUri) =>
+      _DartSourceProxy.wrap(super.mapDartUri(dartUri), Uri.parse(dartUri));
+}
+
+
+/// Dart SDK resolver which wraps all Dart sources to ensure they are tracked
+/// with URIs.
+class DartUriResolverProxy implements DartUriResolver {
+  final DartUriResolver _proxy;
+  DartUriResolverProxy(DirectoryBasedDartSdk sdk) :
+      _proxy = new DartUriResolver(sdk);
+
+  Source resolveAbsolute(Uri uri) =>
+    _DartSourceProxy.wrap(_proxy.resolveAbsolute(uri), uri);
+
+  DartSdk get dartSdk => _proxy.dartSdk;
+
+  Source fromEncoding(UriKind kind, Uri uri) =>
+      throw new UnsupportedError('fromEncoding is not supported');
+
+  Uri restoreAbsolute(Source source) =>
+      throw new UnsupportedError('restoreAbsolute is not supported');
+}
+
+/// Source file for dart: sources which track the sources with dart: URIs.
+///
+/// This is primarily to support [Resolver.getImportUri] for Dart SDK (dart:)
+/// based libraries.
+class _DartSourceProxy implements Source {
+
+  /// Absolute URI which this source can be imported from
+  final Uri uri;
+
+  /// Underlying source object.
+  final Source _proxy;
+
+  _DartSourceProxy(this._proxy, this.uri);
+
+  /// Ensures that [source] is a _DartSourceProxy.
+  static _DartSourceProxy wrap(Source source, Uri uri) {
+    if (source == null || source is _DartSourceProxy) return source;
+    return new _DartSourceProxy(source, uri);
+  }
+
+  Source resolveRelative(Uri relativeUri) {
+    // Assume that the type can be accessed via this URI, since these
+    // should only be parts for dart core files.
+    return wrap(_proxy.resolveRelative(relativeUri), uri);
+  }
+
+  bool exists() => _proxy.exists();
+
+  bool operator ==(Object other) =>
+    (other is _DartSourceProxy && _proxy == other._proxy);
+
+  int get hashCode => _proxy.hashCode;
+
+  TimestampedData<String> get contents => _proxy.contents;
+
+  String get encoding => _proxy.encoding;
+
+  String get fullName => _proxy.fullName;
+
+  int get modificationStamp => _proxy.modificationStamp;
+
+  String get shortName => _proxy.shortName;
+
+  UriKind get uriKind => _proxy.uriKind;
+
+  bool get isInSystemLibrary => _proxy.isInSystemLibrary;
+}
+
 /// Get an asset ID for a URL relative to another source asset.
 AssetId _resolve(AssetId source, String url, TransformLogger logger,
     Span span) {
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index e546e06..4b768d4 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -7,13 +7,9 @@
 import 'dart:async';
 import 'package:barback/barback.dart';
 
-import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
-import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
-
 import 'entry_point.dart';
 import 'resolver.dart';
 import 'resolver_impl.dart';
-import 'dart_sdk.dart' hide dartSdkDirectory;
 
 /// Barback-based code resolvers which maintains up-to-date resolved ASTs for
 /// the specified code entry points.
@@ -25,22 +21,9 @@
 /// the same Resolvers object to minimize re-parsing the AST.
 class Resolvers {
   final Map<AssetId, Resolver> _resolvers = {};
-  final DartSdk dartSdk;
-  final DartUriResolver dartUriResolver;
+  final String dartSdkDirectory;
 
-  Resolvers.fromSdk(this.dartSdk, this.dartUriResolver);
-
-  factory Resolvers(dartSdkDirectory) {
-    var sdk = new DirectoryBasedDartSdkProxy(dartSdkDirectory);
-    var uriResolver = new DartUriResolverProxy(sdk);
-    return new Resolvers.fromSdk(sdk, uriResolver);
-  }
-
-  factory Resolvers.fromMock(Map<String, String> sources,
-      {bool reportMissing: false}) {
-    var sdk = new MockDartSdk(sources, reportMissing: reportMissing);
-    return new Resolvers.fromSdk(sdk, sdk.resolver);
-  }
+  Resolvers(this.dartSdkDirectory);
 
   /// Get a resolver for [transform]. If provided, this resolves the code
   /// starting from each of the assets in [entryPoints]. If not, this resolves
@@ -52,7 +35,7 @@
   Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
     var id = transform.primaryInput.id;
     var resolver = _resolvers.putIfAbsent(id,
-        () => new ResolverImpl(dartSdk, dartUriResolver));
+        () => new ResolverImpl(dartSdkDirectory));
     return resolver.resolve(transform, entryPoints);
   }
 }
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 784c07d..f8897b1 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,10 +1,10 @@
 name: code_transformers
-version: 0.1.4+2
+version: 0.1.3+1
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: ">=0.15.6 <0.16.0"
+  analyzer: ">=0.13.0 <0.14.0"
   barback: ">=0.11.0 <0.15.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/code_transformers/test/resolver_test.dart b/pkg/code_transformers/test/resolver_test.dart
index 5807fd7..3ab00e7 100644
--- a/pkg/code_transformers/test/resolver_test.dart
+++ b/pkg/code_transformers/test/resolver_test.dart
@@ -14,21 +14,9 @@
 
 main() {
   useCompactVMConfiguration();
-  group('mock sdk', () {
-    resolverTests(new Resolvers.fromMock({
-      'dart:core': 'library dart.core;\nclass Object {}',
-      'dart:async': 'library dart.async;',
-      'dart:html': 'library dart.html;',
-    }));
-  });
-
-  group('real sdk', () {
-    resolverTests(new Resolvers(testingDartSdkDirectory));
-  });
-}
-
-resolverTests(Resolvers resolvers) {
   var entryPoint = new AssetId('a', 'web/main.dart');
+  var resolvers = new Resolvers(testingDartSdkDirectory);
+
   Future validateResolver({Map<String, String> inputs, validator(Resolver),
       List<String> messages: const[]}) {
     return applyTransformers(
diff --git a/pkg/docgen/bin/generate_all_docs.sh b/pkg/docgen/bin/generate_all_docs.sh
new file mode 100755
index 0000000..8d5d82c
--- /dev/null
+++ b/pkg/docgen/bin/generate_all_docs.sh
@@ -0,0 +1,6 @@
+# A simple shell script to generate all docs for the sdk and pkg directories
+# into the docs folder in this directory.
+# TODO(alanknight): This should get subsumed into the python scripts
+dart --package-root=$DART_SDK/../packages/ docgen.dart --parse-sdk --json
+dart --old_gen_heap_size=1024 --package-root=$DART_SDK/../packages/ docgen.dart \
+  --package-root=$DART_SDK/../packages/ --append --json $DART_SDK/../../../pkg
diff --git a/pkg/json_rpc_2/CHANGELOG.md b/pkg/json_rpc_2/CHANGELOG.md
index 34123f9..ba15fb3 100644
--- a/pkg/json_rpc_2/CHANGELOG.md
+++ b/pkg/json_rpc_2/CHANGELOG.md
@@ -1,15 +1,3 @@
-## 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 c7ece5b..d05c54f 100644
--- a/pkg/json_rpc_2/lib/src/server.dart
+++ b/pkg/json_rpc_2/lib/src/server.dart
@@ -26,20 +26,6 @@
 /// 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>();
 
@@ -49,104 +35,7 @@
   /// [RpcException.methodNotFound] exception.
   final _fallbacks = new Queue<Function>();
 
-  /// 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;
-  }
+  Server();
 
   /// Registers a method named [name] on this server.
   ///
@@ -180,14 +69,14 @@
     _fallbacks.add(callback);
   }
 
-  /// Handle a request.
+  /// Handle a request that's already been parsed from JSON.
   ///
   /// [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) {
@@ -199,7 +88,28 @@
         var nonNull = results.where((result) => result != null);
         return nonNull.isEmpty ? null : nonNull.toList();
       });
-    }).then(_responses.add);
+    });
+  }
+
+  /// 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);
+    });
   }
 
   /// 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 a212f58..1eff004 100644
--- a/pkg/json_rpc_2/lib/src/utils.dart
+++ b/pkg/json_rpc_2/lib/src/utils.dart
@@ -43,24 +43,3 @@
 /// [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 df1a8a0..2cf1bc8 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.1.0
+version: 0.0.2+3
 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.12.0"
+  unittest: ">=0.9.0 <0.10.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 7dda84f..441df58 100644
--- a/pkg/json_rpc_2/test/server/batch_test.dart
+++ b/pkg/json_rpc_2/test/server/batch_test.dart
@@ -13,17 +13,16 @@
 import 'utils.dart';
 
 void main() {
-  var controller;
+  var server;
   setUp(() {
-    controller = new ServerController();
-    controller.server
+    server = new json_rpc.Server()
         ..registerMethod('foo', () => 'foo')
         ..registerMethod('id', (params) => params.value)
         ..registerMethod('arg', (params) => params['arg'].value);
   });
 
   test('handles a batch of requests', () {
-    expect(controller.handleRequest([
+    expect(server.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}
@@ -35,7 +34,7 @@
   });
 
   test('handles errors individually', () {
-    expect(controller.handleRequest([
+    expect(server.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}
@@ -55,7 +54,7 @@
   });
 
   test('handles notifications individually', () {
-    expect(controller.handleRequest([
+    expect(server.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}
@@ -66,7 +65,7 @@
   });
 
   test('returns nothing if every request is a notification', () {
-    expect(controller.handleRequest([
+    expect(server.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo'},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}}
@@ -74,12 +73,24 @@
   });
 
   test('returns an error if the batch is empty', () {
-    expectErrorResponse(controller, [], error_code.INVALID_REQUEST,
+    expectErrorResponse(server, [], 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(controller.handleRequest([
+    expect(server.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 74cf86f..feeefea 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 controller;
-  setUp(() => controller = new ServerController());
+  var server;
+  setUp(() => server = new json_rpc.Server());
 
   test("a non-Array/Object request is invalid", () {
-    expectErrorResponse(controller, 'foo', error_code.INVALID_REQUEST,
+    expectErrorResponse(server, 'foo', error_code.INVALID_REQUEST,
         'Request must be an Array or an Object.');
   });
 
   test("requests must have a jsonrpc key", () {
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'method': 'foo',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "jsonrpc" key.');
   });
 
   test("the jsonrpc version must be 2.0", () {
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '1.0',
       'method': 'foo',
       'id': 1234
@@ -38,14 +38,14 @@
   });
 
   test("requests must have a method key", () {
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '2.0',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "method" key.');
   });
 
   test("request method must be a string", () {
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '2.0',
       'method': 1234,
       'id': 1234
@@ -54,7 +54,7 @@
   });
 
   test("request params must be an Array or Object", () {
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': 1234,
@@ -64,7 +64,7 @@
   });
 
   test("request id may not be an Array or Object", () {
-    expect(controller.handleRequest({
+    expect(server.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': {'bad': 'id'}
diff --git a/pkg/json_rpc_2/test/server/server_test.dart b/pkg/json_rpc_2/test/server/server_test.dart
index a89a0d99..c18a8ca 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 controller;
-  setUp(() => controller = new ServerController());
+  var server;
+  setUp(() => server = new json_rpc.Server());
 
   test("calls a registered method with the given name", () {
-    controller.server.registerMethod('foo', (params) {
+    server.registerMethod('foo', (params) {
       return {'params': params.value};
     });
 
-    expect(controller.handleRequest({
+    expect(server.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {'param': 'value'},
@@ -34,9 +34,9 @@
   });
 
   test("calls a method that takes no parameters", () {
-    controller.server.registerMethod('foo', () => 'foo');
+    server.registerMethod('foo', () => 'foo');
 
-    expect(controller.handleRequest({
+    expect(server.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -48,9 +48,9 @@
   });
 
   test("a method that takes no parameters rejects parameters", () {
-    controller.server.registerMethod('foo', () => 'foo');
+    server.registerMethod('foo', () => 'foo');
 
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -61,9 +61,9 @@
   });
 
   test("an unexpected error in a method is captured", () {
-    controller.server.registerMethod('foo', () => throw new FormatException('bad format'));
+    server.registerMethod('foo', () => throw new FormatException('bad format'));
 
-    expect(controller.handleRequest({
+    expect(server.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -83,9 +83,9 @@
   });
 
   test("doesn't return a result for a notification", () {
-    controller.server.registerMethod('foo', (args) => 'result');
+    server.registerMethod('foo', (args) => 'result');
 
-    expect(controller.handleRequest({
+    expect(server.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {}
@@ -93,11 +93,11 @@
   });
 
   test("includes the error data in the response", () {
-    controller.server.registerMethod('foo', (params) {
+    server.registerMethod('foo', (params) {
       throw new json_rpc.RpcException(5, 'Error message.', data: 'data value');
     });
 
-    expectErrorResponse(controller, {
+    expectErrorResponse(server, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -108,28 +108,58 @@
         data: 'data value');
   });
 
-  test("a JSON parse error is rejected", () {
-    return controller.handleJsonRequest('invalid json {').then((result) {
-      expect(JSON.decode(result), {
+  group("JSON", () {
+    test("handles a request parsed from JSON", () {
+      server.registerMethod('foo', (params) {
+        return {'params': params.value};
+      });
+
+      expect(server.parseRequest(JSON.encode({
         'jsonrpc': '2.0',
-        'error': {
-          'code': error_code.PARSE_ERROR,
-          'message': startsWith("Invalid JSON: "),
-          'data': {'request': 'invalid json {'}
-        },
-        'id': null
+        '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
+        });
       });
     });
   });
 
   group("fallbacks", () {
     test("calls a fallback if no method matches", () {
-      controller.server
-          ..registerMethod('foo', () => 'foo')
-          ..registerMethod('bar', () => 'foo')
-          ..registerFallback((params) => {'fallback': params.value});
+      server.registerMethod('foo', () => 'foo');
+      server.registerMethod('bar', () => 'foo');
+      server.registerFallback((params) => {'fallback': params.value});
 
-      expect(controller.handleRequest({
+      expect(server.handleRequest({
         'jsonrpc': '2.0',
         'method': 'baz',
         'params': {'param': 'value'},
@@ -142,13 +172,13 @@
     });
 
     test("calls the first matching fallback", () {
-      controller.server
-          ..registerFallback((params) =>
-              throw new json_rpc.RpcException.methodNotFound(params.method))
-          ..registerFallback((params) => 'fallback 2')
-          ..registerFallback((params) => 'fallback 3');
+      server.registerFallback((params) =>
+          throw new json_rpc.RpcException.methodNotFound(params.method));
 
-      expect(controller.handleRequest({
+      server.registerFallback((params) => 'fallback 2');
+      server.registerFallback((params) => 'fallback 3');
+
+      expect(server.handleRequest({
         'jsonrpc': '2.0',
         'method': 'fallback 2',
         'id': 1234
@@ -160,10 +190,9 @@
     });
 
     test("an unexpected error in a fallback is captured", () {
-      controller.server.registerFallback((_) =>
-          throw new FormatException('bad format'));
+      server.registerFallback((_) => throw new FormatException('bad format'));
 
-      expect(controller.handleRequest({
+      expect(server.handleRequest({
         'jsonrpc': '2.0',
         'method': 'foo',
         'id': 1234
@@ -184,8 +213,7 @@
   });
 
   test("disallows multiple methods with the same name", () {
-    controller.server.registerMethod('foo', () => null);
-    expect(() => controller.server.registerMethod('foo', () => null),
-        throwsArgumentError);
+    server.registerMethod('foo', () => null);
+    expect(() => 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 a4fd36a..6f92c0a 100644
--- a/pkg/json_rpc_2/test/server/utils.dart
+++ b/pkg/json_rpc_2/test/server/utils.dart
@@ -4,53 +4,16 @@
 
 library json_rpc_2.test.server.util;
 
-import 'dart:async';
-import 'dart:convert';
-
-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';
+import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
 
-/// 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,
+void expectErrorResponse(json_rpc.Server server, request, int errorCode,
     String message, {data}) {
   var id;
   if (request is Map) id = request['id'];
   if (data == null) data = {'request': request};
 
-  expect(controller.handleRequest(request), completion(equals({
+  expect(server.handleRequest(request), completion(equals({
     'jsonrpc': '2.0',
     'id': id,
     'error': {
@@ -61,25 +24,10 @@
   })));
 }
 
-/// 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/lib/matcher.dart b/pkg/matcher/lib/matcher.dart
index 99fe44b..85694ef 100644
--- a/pkg/matcher/lib/matcher.dart
+++ b/pkg/matcher/lib/matcher.dart
@@ -2,17 +2,31 @@
 // for 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.
+/**
+ * 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/).
+ */
 library matcher;
 
-export 'src/core_matchers.dart';
+import 'dart:async';
+
+import 'src/description.dart';
+import 'src/interfaces.dart';
+
 export 'src/description.dart';
-export 'src/error_matchers.dart';
-export 'src/expect.dart';
-export 'src/future_matchers.dart';
 export 'src/interfaces.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';
+
+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';
diff --git a/pkg/matcher/lib/mirror_matchers.dart b/pkg/matcher/lib/mirror_matchers.dart
index f397128..c836bc9 100644
--- a/pkg/matcher/lib/mirror_matchers.dart
+++ b/pkg/matcher/lib/mirror_matchers.dart
@@ -2,17 +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.
 
-/// 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 356476b..7acd7b4 100644
--- a/pkg/matcher/lib/src/core_matchers.dart
+++ b/pkg/matcher/lib/src/core_matchers.dart
@@ -2,16 +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 matcher.core_matchers;
+part of matcher;
 
-import 'dart:async';
-
-import 'description.dart';
-import 'expect.dart';
-import 'interfaces.dart';
-
-/// Returns a matcher that matches empty strings, maps or iterables
-/// (including collections).
+/**
+ * Returns a matcher that matches empty strings, maps or iterables
+ * (including collections).
+ */
 const Matcher isEmpty = const _Empty();
 
 class _Empty extends Matcher {
@@ -28,10 +24,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 {
@@ -46,10 +42,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 {
@@ -64,8 +60,10 @@
   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 {
@@ -77,16 +75,18 @@
       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, [int 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.
+ */
+Matcher equals(expected, [limit=100]) =>
     expected is String
         ? new _StringEqualsMatcher(expected)
         : new _DeepMatcher(expected, limit);
@@ -96,7 +96,7 @@
   final int _limit;
   var count;
 
-  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
+  _DeepMatcher(this._expected, [limit = 1000]): this._limit = limit;
 
   // Returns a pair (reason, location)
   List _compareIterables(expected, actual, matcher, depth, location) {
@@ -235,7 +235,7 @@
   }
 }
 
-/// A special equality matcher for strings.
+/** A special equality matcher for strings. */
 class _StringEqualsMatcher extends Matcher {
   final String _value;
 
@@ -313,7 +313,7 @@
   }
 }
 
-/// A matcher that matches any value.
+/** A matcher that matches any value. */
 const Matcher anything = const _IsAnything();
 
 class _IsAnything extends Matcher {
@@ -322,76 +322,84 @@
   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;
@@ -401,9 +409,7 @@
       // 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;
@@ -513,29 +519,179 @@
   Description describe(Description description) => description.add(_name);
 }
 
-/// A matcher for Map types.
-const Matcher isMap = const _IsMap();
+/** 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();
 
 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 Matcher isList = const _IsList();
+/** A matcher for List types. */
+const 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 {
@@ -566,15 +722,18 @@
   }
 }
 
-/// 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);
@@ -608,11 +767,14 @@
   }
 }
 
-/// 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);
@@ -632,17 +794,18 @@
       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(bool f(value), [String 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(Function f, [description = 'satisfies function']) =>
     new _Predicate(f, description);
 
-typedef bool _PredicateFunction(value);
-
 class _Predicate extends Matcher {
-  final _PredicateFunction _matcher;
+
+  final Function _matcher;
   final String _description;
 
   const _Predicate(this._matcher, this._description);
@@ -653,25 +816,27 @@
       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;
@@ -680,7 +845,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 f03934d..f8ebf09 100644
--- a/pkg/matcher/lib/src/description.dart
+++ b/pkg/matcher/lib/src/description.dart
@@ -6,39 +6,44 @@
 
 import 'interfaces.dart';
 import 'pretty_print.dart';
+import 'utils.dart';
 
-/// The default implementation of [Description]. This should rarely need
-/// substitution, although conceivably it is a place where other languages
-/// could be supported.
+/**
+ * The default implementation of IDescription. This should rarely need
+ * substitution, although conceivably it is a place where other languages
+ * could be supported.
+ */
 class StringDescription implements Description {
-  final StringBuffer _out = new StringBuffer();
+  var _out;
 
-  /// Initialize the description with initial contents [init].
+  /** Initialize the description with initial contents [init]. */
   StringDescription([String init = '']) {
-    _out.write(init);
+    _out = init;
   }
 
   int get length => _out.length;
 
-  /// Get the description as a string.
-  String toString() => _out.toString();
+  /** Get the description as a string. */
+  String toString() => _out;
 
-  /// Append [text] to the description.
-  Description add(String text) {
-    _out.write(text);
+  /** Append [text] to the description.  */
+  Description add(text) {
+    _out = '${_out}${text}';
     return this;
   }
 
-  /// Change the value of the description.
+  /** Change the value of the description. */
   Description replace(String text) {
-    _out.clear();
-    return add(text);
+    _out = text;
+    return this;
   }
 
-  /// 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);
@@ -48,9 +53,11 @@
     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;
@@ -65,4 +72,11 @@
     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 073ef34..2994163 100644
--- a/pkg/matcher/lib/src/expect.dart
+++ b/pkg/matcher/lib/src/expect.dart
@@ -2,13 +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.
 
-library matcher.expect;
+part of matcher;
 
-import 'core_matchers.dart';
-import 'description.dart';
-import 'interfaces.dart';
-
-/// The objects thrown by the default failure handler.
+/** The objects thrown by the default failure handler. */
 class TestFailure extends Error {
   final String message;
 
@@ -17,7 +13,9 @@
   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);
@@ -26,33 +24,37 @@
   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);
@@ -81,10 +83,12 @@
   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;
@@ -114,10 +118,12 @@
   }
 }
 
-/// 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();
@@ -154,14 +160,17 @@
   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 4c5a391..c9e2742e 100644
--- a/pkg/matcher/lib/src/future_matchers.dart
+++ b/pkg/matcher/lib/src/future_matchers.dart
@@ -2,33 +2,31 @@
 // for 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 matcher.future_matchers;
+part of matcher;
 
-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].
+/**
+ * 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 9fc1107..71079e5 100644
--- a/pkg/matcher/lib/src/interfaces.dart
+++ b/pkg/matcher/lib/src/interfaces.dart
@@ -7,80 +7,97 @@
 // 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 ef7afb0..1922aa1 100644
--- a/pkg/matcher/lib/src/iterable_matchers.dart
+++ b/pkg/matcher/lib/src/iterable_matchers.dart
@@ -2,19 +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 matcher.iterable_matchers;
+part of 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].
+/**
+ * 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 {
-  final Matcher _matcher;
+  Matcher _matcher;
 
   _EveryElement(Matcher this._matcher);
 
@@ -44,10 +41,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.toString());
+        mismatchDescription.add(subDescription);
       } else {
         mismatchDescription.add("doesn't match ");
         _matcher.describe(mismatchDescription);
@@ -60,12 +57,14 @@
   }
 }
 
-/// 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 {
-  final Matcher _matcher;
+  Matcher _matcher;
 
   _AnyElement(this._matcher);
 
@@ -77,9 +76,11 @@
       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);
 
@@ -108,10 +109,12 @@
   }
 }
 
-/// 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 {
@@ -128,8 +131,10 @@
         .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,
@@ -145,10 +150,12 @@
   }
 }
 
-/// 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 {
@@ -209,20 +216,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, bool comparator(a, b),
+/**
+ * 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,
     String description) =>
         new _PairwiseCompare(expected, comparator, description);
 
-typedef bool _Comparator(a, b);
-
 class _PairwiseCompare extends _IterableMatcher {
-  final Iterable _expected;
-  final _Comparator _comparator;
-  final String _description;
+  Iterable _expected;
+  Function _comparator;
+  String _description;
 
   _PairwiseCompare(this._expected, this._comparator, this._description);
 
@@ -263,3 +270,4 @@
     }
   }
 }
+
diff --git a/pkg/matcher/lib/src/map_matchers.dart b/pkg/matcher/lib/src/map_matchers.dart
index a560e50..033e906 100644
--- a/pkg/matcher/lib/src/map_matchers.dart
+++ b/pkg/matcher/lib/src/map_matchers.dart
@@ -2,12 +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.
 
-library matcher.map_matchers;
+part of matcher;
 
-import 'expect.dart';
-import 'interfaces.dart';
-
-/// Returns a matcher which matches maps containing the given [value].
+/**
+ * Returns a matcher which matches maps containing the given [value].
+ */
 Matcher containsValue(value) => new _ContainsValue(value);
 
 class _ContainsValue extends Matcher {
@@ -20,8 +19,10 @@
       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 ae0b0ad..507a682 100644
--- a/pkg/matcher/lib/src/numeric_matchers.dart
+++ b/pkg/matcher/lib/src/numeric_matchers.dart
@@ -2,55 +2,73 @@
 // for 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 matcher.numeric_matchers;
+part of matcher;
 
-import 'interfaces.dart';
-
-/// Returns a matcher which matches if the match argument is greater
-/// than the given [value].
+/**
+ * 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);
@@ -59,20 +77,18 @@
   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(
@@ -81,7 +97,7 @@
     this._lessThanValue,
     this._greaterThanValue,
     this._comparisonDescription,
-    [bool valueInDescription = true]) :
+    [valueInDescription = true]) :
       this._valueInDescription = valueInDescription;
 
   bool matches(item, Map matchState) {
@@ -110,10 +126,12 @@
   }
 }
 
-/// 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);
+/**
+ * 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);
 
 class _IsCloseTo extends Matcher {
   final num _value, _delta;
@@ -149,25 +167,29 @@
   }
 }
 
-/// 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 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 [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 [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 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 [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 or equal to a [low] and less than [high].
-Matcher inClosedOpenRange(num low, num 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(low, high) => new _InRange(low, high, true, false);
 
 class _InRange extends Matcher {
   final num _low, _high;
@@ -209,3 +231,4 @@
     }
   }
 }
+
diff --git a/pkg/matcher/lib/src/operator_matchers.dart b/pkg/matcher/lib/src/operator_matchers.dart
index fb79e8f..fa17aba 100644
--- a/pkg/matcher/lib/src/operator_matchers.dart
+++ b/pkg/matcher/lib/src/operator_matchers.dart
@@ -2,13 +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.
 
-library matcher.operator_matchers;
+part of matcher;
 
-import 'core_matchers.dart';
-import 'expect.dart';
-import 'interfaces.dart';
-
-/// This returns a matcher that inverts [matcher] to its logical negation.
+/**
+ * This returns a matcher that inverts [matcher] to its logical negation.
+ */
 Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
 
 class _IsNot extends Matcher {
@@ -22,11 +20,13 @@
     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,11 +34,46 @@
               arg4 = null,
               arg5 = null,
               arg6 = null]) {
-  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
+  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);
+  }
 }
 
 class _AllOf extends Matcher {
-  final List<Matcher> _matchers;
+  final Iterable<Matcher> _matchers;
 
   const _AllOf(this._matchers);
 
@@ -64,15 +99,17 @@
       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,
@@ -81,62 +118,59 @@
                 arg4 = null,
                 arg5 = null,
                 arg6 = null]) {
-  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
-}
-
-class _AnyOf extends Matcher {
-  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;
-  }
-
-  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();
+    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);
   }
-
-  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;
 }
+
+class _AnyOf extends Matcher {
+  final Iterable<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;
+  }
+
+  Description describe(Description description) =>
+    description.addAll('(', ' or ', ')', _matchers);
+}
+
diff --git a/pkg/matcher/lib/src/pretty_print.dart b/pkg/matcher/lib/src/pretty_print.dart
index eb13448..7deae06 100644
--- a/pkg/matcher/lib/src/pretty_print.dart
+++ b/pkg/matcher/lib/src/pretty_print.dart
@@ -6,16 +6,19 @@
 
 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.
@@ -32,7 +35,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();
@@ -80,7 +83,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");
@@ -97,7 +100,7 @@
           object == null || defaultToString) {
         return value;
       } else {
-        return "${_typeName(object)}:$value";
+        return "${typeName(object)}:$value";
       }
     }
   }
@@ -106,42 +109,3 @@
 }
 
 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 c498446..f5e32ff 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.
 
-library matcher.string_matchers;
+part of matcher;
 
-import 'interfaces.dart';
-
-/// Returns a matcher which matches if the match argument is a string and
-/// is equal to [value] when compared case-insensitively.
+/**
+ * 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;
-  final String _matchValue;
+  String _matchValue;
 
-  _IsEqualIgnoringCase(String value)
-      : _value = value,
-        _matchValue = value.toLowerCase();
+  _IsEqualIgnoringCase(this._value) {
+    _matchValue = _value.toLowerCase();
+  }
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == item.toLowerCase();
@@ -25,22 +25,24 @@
       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 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) =>
+    new _IsEqualIgnoringWhitespace(_string);
 
 class _IsEqualIgnoringWhitespace extends _StringMatcher {
   final String _value;
-  final String _matchValue;
+  String _matchValue;
 
-  _IsEqualIgnoringWhitespace(String value)
-      : _value = value,
-        _matchValue = collapseWhitespace(value);
+  _IsEqualIgnoringWhitespace(this._value) {
+    _matchValue = collapseWhitespace(_value);
+  }
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == collapseWhitespace(item);
@@ -61,8 +63,33 @@
   }
 }
 
-/// Returns a matcher that matches if the match argument is a string and
-/// starts with [prefixString].
+/**
+ * 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].
+ */
 Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
 
 class _StringStartsWith extends _StringMatcher {
@@ -77,11 +104,14 @@
       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);
@@ -93,16 +123,19 @@
       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(List<String> substrings) =>
+Matcher stringContainsInOrder(substrings) =>
     new _StringContainsInOrder(substrings);
 
 class _StringContainsInOrder extends _StringMatcher {
+
   final List<String> _substrings;
 
   const _StringContainsInOrder(this._substrings);
@@ -114,7 +147,8 @@
     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;
   }
@@ -124,10 +158,12 @@
                                                   _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 {
@@ -166,26 +202,3 @@
     }
   }
 }
-
-/// 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/lib/src/utils.dart b/pkg/matcher/lib/src/utils.dart
new file mode 100644
index 0000000..c2182c2
--- /dev/null
+++ b/pkg/matcher/lib/src/utils.dart
@@ -0,0 +1,69 @@
+// 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 matcher.utils;
+
+/**
+ * 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;
+}
+
+/** Indent each line in [str] by two spaces. */
+String indent(String str) =>
+  str.replaceAll(new RegExp("^", multiLine: true), "  ");
+
+/** A pair of values. */
+class Pair<E, F> {
+  E first;
+  F last;
+
+  Pair(this.first, this.last);
+
+  String toString() => '($first, $last)';
+
+  bool operator ==(other) {
+    if (other is! Pair) return false;
+    return other.first == first && other.last == last;
+  }
+
+  int get hashCode => first.hashCode ^ last.hashCode;
+}
+
diff --git a/pkg/matcher/pubspec.yaml b/pkg/matcher/pubspec.yaml
index 87ab0cf..63f8191 100644
--- a/pkg/matcher/pubspec.yaml
+++ b/pkg/matcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.10.0+3
+version: 0.10.0
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: http://www.dartlang.org
diff --git a/pkg/matcher/test/matchers_test.dart b/pkg/matcher/test/matchers_test.dart
new file mode 100644
index 0000000..e74d048
--- /dev/null
+++ b/pkg/matcher/test/matchers_test.dart
@@ -0,0 +1,803 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 matcher.test;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:matcher/matcher.dart';
+import 'package:unittest/unittest.dart' show test, group;
+
+import 'test_utils.dart';
+
+void main() {
+
+  initUtils();
+
+  // Core matchers
+
+  group('Core matchers', () {
+
+    test('isTrue', () {
+      shouldPass(true, isTrue);
+      shouldFail(false, isTrue, "Expected: true Actual: <false>");
+    });
+
+    test('isFalse', () {
+      shouldPass(false, isFalse);
+      shouldFail(10, isFalse, "Expected: false Actual: <10>");
+      shouldFail(true, isFalse, "Expected: false Actual: <true>");
+    });
+
+    test('isNull', () {
+      shouldPass(null, isNull);
+      shouldFail(false, isNull, "Expected: null Actual: <false>");
+    });
+
+    test('isNotNull', () {
+      shouldPass(false, isNotNull);
+      shouldFail(null, isNotNull, "Expected: not null Actual: <null>");
+    });
+
+    test('same', () {
+      var a = new Map();
+      var b = new Map();
+      shouldPass(a, same(a));
+      shouldFail(b, same(a), "Expected: same instance as {} Actual: {}");
+    });
+
+    test('equals', () {
+      var a = new Map();
+      var b = new Map();
+      shouldPass(a, equals(a));
+      shouldPass(a, equals(b));
+    });
+
+    test('anything', () {
+      var a = new Map();
+      shouldPass(0, anything);
+      shouldPass(null, anything);
+      shouldPass(a, anything);
+      shouldFail(a, isNot(anything), "Expected: not anything Actual: {}");
+    });
+
+    test('throws', () {
+      shouldFail(doesNotThrow, throws,
+          matches(
+              r"Expected: throws"
+              r"  Actual: <Closure(: \(\) => dynamic "
+              r"from Function 'doesNotThrow': static\.)?>"
+              r"   Which: did not throw"));
+      shouldPass(doesThrow, throws);
+      shouldFail(true, throws,
+          "Expected: throws"
+          "  Actual: <true>"
+          "   Which: is not a Function or Future");
+    });
+
+    test('throwsA', () {
+      shouldPass(doesThrow, throwsA(equals('X')));
+      shouldFail(doesThrow, throwsA(equals('Y')),
+          matches(
+              r"Expected: throws 'Y'"
+              r"  Actual: <Closure(: \(\) => dynamic "
+              r"from Function 'doesThrow': static\.)?>"
+              r"   Which: threw 'X'"));
+    });
+
+    test('returnsNormally', () {
+      shouldPass(doesNotThrow, returnsNormally);
+      shouldFail(doesThrow, returnsNormally,
+          matches(
+              r"Expected: return normally"
+              r"  Actual: <Closure(: \(\) => dynamic "
+              r"from Function 'doesThrow': static\.)?>"
+              r"   Which: threw 'X'"));
+    });
+
+
+    test('hasLength', () {
+      var a = new Map();
+      var b = new List();
+      shouldPass(a, hasLength(0));
+      shouldPass(b, hasLength(0));
+      shouldPass('a', hasLength(1));
+      shouldFail(0, hasLength(0), new PrefixMatcher(
+          "Expected: an object with length of <0> "
+          "Actual: <0> "
+          "Which: has no length property"));
+
+      b.add(0);
+      shouldPass(b, hasLength(1));
+      shouldFail(b, hasLength(2),
+          "Expected: an object with length of <2> "
+          "Actual: [0] "
+          "Which: has length of <1>");
+
+      b.add(0);
+      shouldFail(b, hasLength(1),
+          "Expected: an object with length of <1> "
+          "Actual: [0, 0] "
+          "Which: has length of <2>");
+      shouldPass(b, hasLength(2));
+    });
+
+    test('scalar type mismatch', () {
+      shouldFail('error', equals(5.1),
+          "Expected: <5.1> "
+          "Actual: 'error'");
+    });
+
+    test('nested type mismatch', () {
+      shouldFail(['error'], equals([5.1]),
+          "Expected: [5.1] "
+          "Actual: ['error'] "
+          "Which: was 'error' instead of <5.1> at location [0]");
+    });
+
+    test('doubly-nested type mismatch', () {
+      shouldFail([['error']], equals([[5.1]]),
+          "Expected: [[5.1]] "
+          "Actual: [['error']] "
+          "Which: was 'error' instead of <5.1> at location [0][0]");
+    });
+
+    test('doubly nested inequality', () {
+      var actual1 = [['foo', 'bar'], ['foo'], 3, []];
+      var expected1 = [['foo', 'bar'], ['foo'], 4, []];
+      var reason1 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+          "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+          "Which: was <3> instead of <4> at location [2]";
+
+      var actual2 = [['foo', 'barry'], ['foo'], 4, []];
+      var expected2 = [['foo', 'bar'], ['foo'], 4, []];
+      var reason2 = "Expected: [['foo', 'bar'], ['foo'], 4, []] "
+          "Actual: [['foo', 'barry'], ['foo'], 4, []] "
+          "Which: was 'barry' instead of 'bar' at location [0][1]";
+
+      var actual3 = [['foo', 'bar'], ['foo'], 4, {'foo':'bar'}];
+      var expected3 = [['foo', 'bar'], ['foo'], 4, {'foo':'barry'}];
+      var reason3 = "Expected: [['foo', 'bar'], ['foo'], 4, {'foo': 'barry'}] "
+          "Actual: [['foo', 'bar'], ['foo'], 4, {'foo': 'bar'}] "
+          "Which: was 'bar' instead of 'barry' at location [3]['foo']";
+
+      shouldFail(actual1, equals(expected1), reason1);
+      shouldFail(actual2, equals(expected2), reason2);
+      shouldFail(actual3, equals(expected3), reason3);
+    });
+  });
+
+  group('Numeric Matchers', () {
+
+    test('greaterThan', () {
+      shouldPass(10, greaterThan(9));
+      shouldFail(9, greaterThan(10),
+        "Expected: a value greater than <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than <10>");
+    });
+
+    test('greaterThanOrEqualTo', () {
+      shouldPass(10, greaterThanOrEqualTo(10));
+      shouldFail(9, greaterThanOrEqualTo(10),
+        "Expected: a value greater than or equal to <10> "
+        "Actual: <9> "
+        "Which: is not a value greater than or equal to <10>");
+    });
+
+    test('lessThan', () {
+      shouldFail(10, lessThan(9),
+          "Expected: a value less than <9> "
+          "Actual: <10> "
+          "Which: is not a value less than <9>");
+      shouldPass(9, lessThan(10));
+    });
+
+    test('lessThanOrEqualTo', () {
+      shouldPass(10, lessThanOrEqualTo(10));
+      shouldFail(11, lessThanOrEqualTo(10),
+        "Expected: a value less than or equal to <10> "
+        "Actual: <11> "
+        "Which: is not a value less than or equal to <10>");
+    });
+
+    test('isZero', () {
+      shouldPass(0, isZero);
+      shouldFail(1, isZero,
+          "Expected: a value equal to <0> "
+          "Actual: <1> "
+          "Which: is not a value equal to <0>");
+    });
+
+    test('isNonZero', () {
+      shouldFail(0, isNonZero,
+          "Expected: a value not equal to <0> "
+          "Actual: <0> "
+          "Which: is not a value not equal to <0>");
+      shouldPass(1, isNonZero);
+    });
+
+    test('isPositive', () {
+      shouldFail(-1, isPositive,
+          "Expected: a positive value "
+          "Actual: <-1> "
+          "Which: is not a positive value");
+      shouldFail(0, isPositive,
+          "Expected: a positive value "
+          "Actual: <0> "
+          "Which: is not a positive value");
+      shouldPass(1, isPositive);
+    });
+
+    test('isNegative', () {
+      shouldPass(-1, isNegative);
+      shouldFail(0, isNegative,
+          "Expected: a negative value "
+          "Actual: <0> "
+          "Which: is not a negative value");
+    });
+
+    test('isNonPositive', () {
+      shouldPass(-1, isNonPositive);
+      shouldPass(0, isNonPositive);
+      shouldFail(1, isNonPositive,
+          "Expected: a non-positive value "
+          "Actual: <1> "
+          "Which: is not a non-positive value");
+    });
+
+    test('isNonNegative', () {
+      shouldPass(1, isNonNegative);
+      shouldPass(0, isNonNegative);
+      shouldFail(-1, isNonNegative,
+        "Expected: a non-negative value "
+        "Actual: <-1> "
+        "Which: is not a non-negative value");
+    });
+
+    test('closeTo', () {
+      shouldPass(0, closeTo(0, 1));
+      shouldPass(-1, closeTo(0, 1));
+      shouldPass(1, closeTo(0, 1));
+      shouldFail(1.001, closeTo(0, 1),
+          "Expected: a numeric value within <1> of <0> "
+          "Actual: <1.001> "
+          "Which: differs by <1.001>");
+      shouldFail(-1.001, closeTo(0, 1),
+          "Expected: a numeric value within <1> of <0> "
+          "Actual: <-1.001> "
+          "Which: differs by <1.001>");
+    });
+
+    test('inInclusiveRange', () {
+      shouldFail(-1, inInclusiveRange(0,2),
+          "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+          "Actual: <-1>");
+      shouldPass(0, inInclusiveRange(0,2));
+      shouldPass(1, inInclusiveRange(0,2));
+      shouldPass(2, inInclusiveRange(0,2));
+      shouldFail(3, inInclusiveRange(0,2),
+          "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
+          "Actual: <3>");
+    });
+
+    test('inExclusiveRange', () {
+      shouldFail(0, inExclusiveRange(0,2),
+          "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+          "Actual: <0>");
+      shouldPass(1, inExclusiveRange(0,2));
+      shouldFail(2, inExclusiveRange(0,2),
+          "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
+          "Actual: <2>");
+    });
+
+    test('inOpenClosedRange', () {
+      shouldFail(0, inOpenClosedRange(0,2),
+          "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
+          "Actual: <0>");
+      shouldPass(1, inOpenClosedRange(0,2));
+      shouldPass(2, inOpenClosedRange(0,2));
+    });
+
+    test('inClosedOpenRange', () {
+      shouldPass(0, inClosedOpenRange(0,2));
+      shouldPass(1, inClosedOpenRange(0,2));
+      shouldFail(2, inClosedOpenRange(0,2),
+          "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
+          "Actual: <2>");
+    });
+  });
+
+  group('String Matchers', () {
+
+    test('isEmpty', () {
+      shouldPass('', isEmpty);
+      shouldFail(null, isEmpty,
+          "Expected: empty Actual: <null>");
+      shouldFail(0, isEmpty,
+          "Expected: empty Actual: <0>");
+      shouldFail('a', isEmpty, "Expected: empty Actual: 'a'");
+    });
+
+    test('equalsIgnoringCase', () {
+      shouldPass('hello', equalsIgnoringCase('HELLO'));
+      shouldFail('hi', equalsIgnoringCase('HELLO'),
+          "Expected: 'HELLO' ignoring case Actual: 'hi'");
+    });
+
+    test('equalsIgnoringWhitespace', () {
+      shouldPass(' hello   world  ', equalsIgnoringWhitespace('hello world'));
+      shouldFail(' helloworld  ', equalsIgnoringWhitespace('hello world'),
+          "Expected: 'hello world' ignoring whitespace "
+          "Actual: ' helloworld ' "
+          "Which: is 'helloworld' with whitespace compressed");
+    });
+
+    test('startsWith', () {
+      shouldPass('hello', startsWith(''));
+      shouldPass('hello', startsWith('hell'));
+      shouldPass('hello', startsWith('hello'));
+      shouldFail('hello', startsWith('hello '),
+          "Expected: a string starting with 'hello ' "
+          "Actual: 'hello'");
+    });
+
+    test('endsWith', () {
+      shouldPass('hello', endsWith(''));
+      shouldPass('hello', endsWith('lo'));
+      shouldPass('hello', endsWith('hello'));
+      shouldFail('hello', endsWith(' hello'),
+          "Expected: a string ending with ' hello' "
+          "Actual: 'hello'");
+    });
+
+    test('contains', () {
+      shouldPass('hello', contains(''));
+      shouldPass('hello', contains('h'));
+      shouldPass('hello', contains('o'));
+      shouldPass('hello', contains('hell'));
+      shouldPass('hello', contains('hello'));
+      shouldFail('hello', contains(' '),
+          "Expected: contains ' ' Actual: 'hello'");
+    });
+
+    test('stringContainsInOrder', () {
+      shouldPass('goodbye cruel world', stringContainsInOrder(['']));
+      shouldPass('goodbye cruel world', stringContainsInOrder(['goodbye']));
+      shouldPass('goodbye cruel world', stringContainsInOrder(['cruel']));
+      shouldPass('goodbye cruel world', stringContainsInOrder(['world']));
+      shouldPass('goodbye cruel world',
+                 stringContainsInOrder(['good', 'bye', 'world']));
+      shouldPass('goodbye cruel world',
+                 stringContainsInOrder(['goodbye', 'cruel']));
+      shouldPass('goodbye cruel world',
+                 stringContainsInOrder(['cruel', 'world']));
+      shouldPass('goodbye cruel world',
+        stringContainsInOrder(['goodbye', 'cruel', 'world']));
+      shouldFail('goodbye cruel world',
+        stringContainsInOrder(['goo', 'cruel', 'bye']),
+        "Expected: a string containing 'goo', 'cruel', 'bye' in order "
+        "Actual: 'goodbye cruel world'");
+    });
+
+    test('matches', () {
+      shouldPass('c0d', matches('[a-z][0-9][a-z]'));
+      shouldPass('c0d', matches(new RegExp('[a-z][0-9][a-z]')));
+      shouldFail('cOd', matches('[a-z][0-9][a-z]'),
+          "Expected: match '[a-z][0-9][a-z]' Actual: 'cOd'");
+    });
+  });
+
+  group('Iterable Matchers', () {
+
+    test('isEmpty', () {
+      shouldPass([], isEmpty);
+      shouldFail([1], isEmpty, "Expected: empty Actual: [1]");
+    });
+
+    test('contains', () {
+      var d = [1, 2];
+      shouldPass(d, contains(1));
+      shouldFail(d, contains(0), "Expected: contains <0> "
+          "Actual: [1, 2]");
+    });
+
+    test('equals with matcher element', () {
+      var d = ['foo', 'bar'];
+      shouldPass(d, equals(['foo', startsWith('ba')]));
+      shouldFail(d, equals(['foo', endsWith('ba')]),
+          "Expected: ['foo', <a string ending with 'ba'>] "
+          "Actual: ['foo', 'bar'] "
+          "Which: does not match a string ending with 'ba' at location [1]");
+    });
+
+    test('isIn', () {
+      var d = [1, 2];
+      shouldPass(1, isIn(d));
+      shouldFail(0, isIn(d), "Expected: is in [1, 2] Actual: <0>");
+    });
+
+    test('everyElement', () {
+      var d = [1, 2];
+      var e = [1, 1, 1];
+      shouldFail(d, everyElement(1),
+          "Expected: every element(<1>) "
+          "Actual: [1, 2] "
+          "Which: has value <2> which doesn't match <1> at index 1");
+      shouldPass(e, everyElement(1));
+    });
+
+    test('nested everyElement', () {
+      var d = [['foo', 'bar'], ['foo'], []];
+      var e = [['foo', 'bar'], ['foo'], 3, []];
+      shouldPass(d, everyElement(anyOf(isEmpty, contains('foo'))));
+      shouldFail(d, everyElement(everyElement(equals('foo'))),
+          "Expected: every element(every element('foo')) "
+          "Actual: [['foo', 'bar'], ['foo'], []] "
+          "Which: has value ['foo', 'bar'] which has value 'bar' "
+          "which is different. Expected: foo Actual: bar ^ "
+          "Differ at offset 0 at index 1 at index 0");
+      shouldFail(d, everyElement(allOf(hasLength(greaterThan(0)),
+          contains('foo'))),
+           "Expected: every element((an object with length of a value "
+           "greater than <0> and contains 'foo')) "
+           "Actual: [['foo', 'bar'], ['foo'], []] "
+           "Which: has value [] which has length of <0> at index 2");
+      shouldFail(d, everyElement(allOf(contains('foo'),
+          hasLength(greaterThan(0)))),
+          "Expected: every element((contains 'foo' and "
+          "an object with length of a value greater than <0>)) "
+          "Actual: [['foo', 'bar'], ['foo'], []] "
+          "Which: has value [] which doesn't match (contains 'foo' and "
+          "an object with length of a value greater than <0>) at index 2");
+      shouldFail(e, everyElement(allOf(contains('foo'),
+          hasLength(greaterThan(0)))),
+          "Expected: every element((contains 'foo' and an object with "
+          "length of a value greater than <0>)) "
+          "Actual: [['foo', 'bar'], ['foo'], 3, []] "
+          "Which: has value <3> which is not a string, map or iterable "
+          "at index 2");
+    });
+
+    test('anyElement', () {
+      var d = [1, 2];
+      var e = [1, 1, 1];
+      shouldPass(d, anyElement(2));
+      shouldFail(e, anyElement(2),
+          "Expected: some element <2> Actual: [1, 1, 1]");
+    });
+
+    test('orderedEquals', () {
+      shouldPass([null], orderedEquals([null]));
+      var d = [1, 2];
+      shouldPass(d, orderedEquals([1, 2]));
+      shouldFail(d, orderedEquals([2, 1]),
+          "Expected: equals [2, 1] ordered "
+          "Actual: [1, 2] "
+          "Which: was <1> instead of <2> at location [0]");
+    });
+
+    test('unorderedEquals', () {
+      var d = [1, 2];
+      shouldPass(d, unorderedEquals([2, 1]));
+      shouldFail(d, unorderedEquals([1]),
+          "Expected: equals [1] unordered "
+          "Actual: [1, 2] "
+          "Which: has too many elements (2 > 1)");
+      shouldFail(d, unorderedEquals([3, 2, 1]),
+          "Expected: equals [3, 2, 1] unordered "
+          "Actual: [1, 2] "
+          "Which: has too few elements (2 < 3)");
+      shouldFail(d, unorderedEquals([3, 1]),
+          "Expected: equals [3, 1] unordered "
+          "Actual: [1, 2] "
+          "Which: has no match for <3> at index 0");
+    });
+
+    test('unorderedMatchess', () {
+      var d = [1, 2];
+      shouldPass(d, unorderedMatches([2, 1]));
+      shouldPass(d, unorderedMatches([greaterThan(1), greaterThan(0)]));
+      shouldFail(d, unorderedMatches([greaterThan(0)]),
+          "Expected: matches [a value greater than <0>] unordered "
+          "Actual: [1, 2] "
+          "Which: has too many elements (2 > 1)");
+      shouldFail(d, unorderedMatches([3, 2, 1]),
+          "Expected: matches [<3>, <2>, <1>] unordered "
+          "Actual: [1, 2] "
+          "Which: has too few elements (2 < 3)");
+      shouldFail(d, unorderedMatches([3, 1]),
+          "Expected: matches [<3>, <1>] unordered "
+          "Actual: [1, 2] "
+          "Which: has no match for <3> at index 0");
+      shouldFail(d, unorderedMatches([greaterThan(3), greaterThan(0)]),
+          "Expected: matches [a value greater than <3>, a value greater than "
+              "<0>] unordered "
+          "Actual: [1, 2] "
+          "Which: has no match for a value greater than <3> at index 0");
+    });
+
+    test('pairwise compare', () {
+      var c = [1, 2];
+      var d = [1, 2, 3];
+      var e = [1, 4, 9];
+      shouldFail('x', pairwiseCompare(e, (e,a) => a <= e,
+          "less than or equal"),
+          "Expected: pairwise less than or equal [1, 4, 9] "
+          "Actual: 'x' "
+          "Which: is not an Iterable");
+      shouldFail(c, pairwiseCompare(e, (e,a) => a <= e, "less than or equal"),
+          "Expected: pairwise less than or equal [1, 4, 9] "
+          "Actual: [1, 2] "
+          "Which: has length 2 instead of 3");
+      shouldPass(d, pairwiseCompare(e, (e,a) => a <= e, "less than or equal"));
+      shouldFail(d, pairwiseCompare(e, (e,a) => a < e, "less than"),
+          "Expected: pairwise less than [1, 4, 9] "
+          "Actual: [1, 2, 3] "
+          "Which: has <1> which is not less than <1> at index 0");
+      shouldPass(d, pairwiseCompare(e, (e,a) => a * a == e, "square root of"));
+      shouldFail(d, pairwiseCompare(e, (e,a) => a + a == e, "double"),
+          "Expected: pairwise double [1, 4, 9] "
+          "Actual: [1, 2, 3] "
+          "Which: has <1> which is not double <1> at index 0");
+    });
+  });
+
+  group('Map Matchers', () {
+
+    test('isEmpty', () {
+      var a = new Map();
+      shouldPass({}, isEmpty);
+      shouldPass(a, isEmpty);
+      a['foo'] = 'bar';
+      shouldFail(a, isEmpty, "Expected: empty "
+          "Actual: {'foo': 'bar'}");
+    });
+
+    test('equals', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      var b = new Map();
+      b['foo'] = 'bar';
+      var c = new Map();
+      c['bar'] = 'foo';
+      shouldPass(a, equals(b));
+      shouldFail(b, equals(c),
+          "Expected: {'bar': 'foo'} "
+          "Actual: {'foo': 'bar'} "
+          "Which: is missing map key 'bar'");
+    });
+
+    test('equals with different lengths', () {
+      var a = new LinkedHashMap();
+      a['foo'] = 'bar';
+      var b = new LinkedHashMap();
+      b['foo'] = 'bar';
+      b['bar'] = 'foo';
+      var c = new LinkedHashMap();
+      c['bar'] = 'foo';
+      c['barrista'] = 'caffeine';
+      shouldFail(a, equals(b),
+          "Expected: {'foo': 'bar', 'bar': 'foo'} "
+          "Actual: {'foo': 'bar'} "
+          "Which: has different length and is missing map key 'bar'");
+      shouldFail(b, equals(a),
+          "Expected: {'foo': 'bar'} "
+          "Actual: {'foo': 'bar', 'bar': 'foo'} "
+          "Which: has different length and has extra map key 'bar'");
+      shouldFail(b, equals(c),
+          "Expected: {'bar': 'foo', 'barrista': 'caffeine'} "
+          "Actual: {'foo': 'bar', 'bar': 'foo'} "
+          "Which: is missing map key 'barrista'");
+      shouldFail(c, equals(b),
+          "Expected: {'foo': 'bar', 'bar': 'foo'} "
+          "Actual: {'bar': 'foo', 'barrista': 'caffeine'} "
+          "Which: is missing map key 'foo'");
+      shouldFail(a, equals(c),
+          "Expected: {'bar': 'foo', 'barrista': 'caffeine'} "
+          "Actual: {'foo': 'bar'} "
+          "Which: has different length and is missing map key 'bar'");
+      shouldFail(c, equals(a),
+          "Expected: {'foo': 'bar'} "
+          "Actual: {'bar': 'foo', 'barrista': 'caffeine'} "
+          "Which: has different length and is missing map key 'foo'");
+    });
+
+    test('equals with matcher value', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      shouldPass(a, equals({'foo': startsWith('ba')}));
+      shouldFail(a, equals({'foo': endsWith('ba')}),
+          "Expected: {'foo': <a string ending with 'ba'>} "
+          "Actual: {'foo': 'bar'} "
+          "Which: does not match a string ending with 'ba' "
+              "at location ['foo']");
+    });
+
+    test('contains', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      var b = new Map();
+      shouldPass(a, contains('foo'));
+      shouldFail(b, contains('foo'),
+          "Expected: contains 'foo' Actual: {}");
+      shouldFail(10, contains('foo'),
+          "Expected: contains 'foo' Actual: <10> "
+          "Which: is not a string, map or iterable");
+    });
+
+    test('containsValue', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      shouldPass(a, containsValue('bar'));
+      shouldFail(a, containsValue('ba'),
+          "Expected: contains value 'ba' "
+          "Actual: {'foo': 'bar'}");
+    });
+
+    test('containsPair', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      shouldPass(a, containsPair('foo', 'bar'));
+      shouldFail(a, containsPair('foo', 'ba'),
+          "Expected: contains pair 'foo' => 'ba' "
+          "Actual: {'foo': 'bar'} "
+          "Which: is different. Both strings start the same, but "
+          "the given value also has the following trailing characters: r");
+      shouldFail(a, containsPair('fo', 'bar'),
+          "Expected: contains pair 'fo' => 'bar' "
+          "Actual: {'foo': 'bar'} "
+          "Which: doesn't contain key 'fo'");
+    });
+
+    test('hasLength', () {
+      var a = new Map();
+      a['foo'] = 'bar';
+      var b = new Map();
+      shouldPass(a, hasLength(1));
+      shouldFail(b, hasLength(1),
+          "Expected: an object with length of <1> "
+          "Actual: {} "
+          "Which: has length of <0>");
+    });
+  });
+
+  group('Operator Matchers', () {
+
+    test('anyOf', () {
+      shouldFail(0, anyOf([equals(1), equals(2)]),
+          "Expected: (<1> or <2>) Actual: <0>");
+      shouldPass(1, anyOf([equals(1), equals(2)]));
+    });
+
+    test('allOf', () {
+      shouldPass(1, allOf([lessThan(10), greaterThan(0)]));
+      shouldFail(-1, allOf([lessThan(10), greaterThan(0)]),
+          "Expected: (a value less than <10> and a value greater than <0>) "
+          "Actual: <-1> "
+          "Which: is not a value greater than <0>");
+    });
+  });
+
+  group('Future Matchers', () {
+
+    test('completes - unexpected error', () {
+      var completer = new Completer();
+      completer.completeError('X');
+      shouldFail(completer.future, completes,
+          contains('Expected future to complete successfully, '
+                   'but it failed with X'),
+          isAsync: true);
+    });
+
+    test('completes - successfully', () {
+      var completer = new Completer();
+      completer.complete('1');
+      shouldPass(completer.future, completes, isAsync: true);
+    });
+
+    test('throws - unexpected to see normal completion', () {
+      var completer = new Completer();
+      completer.complete('1');
+      shouldFail(completer.future, throws,
+        contains("Expected future to fail, but succeeded with '1'"),
+        isAsync: true);
+    });
+
+    test('throws - expected to see exception', () {
+      var completer = new Completer();
+      completer.completeError('X');
+      shouldPass(completer.future, throws, isAsync: true);
+    });
+
+    test('throws - expected to see exception thrown later on', () {
+      var completer = new Completer();
+      var chained = completer.future.then((_) { throw 'X'; });
+      shouldPass(chained, throws, isAsync: true);
+      completer.complete('1');
+    });
+
+    test('throwsA - unexpected normal completion', () {
+      var completer = new Completer();
+      completer.complete('1');
+      shouldFail(completer.future, throwsA(equals('X')),
+        contains("Expected future to fail, but succeeded with '1'"),
+        isAsync: true);
+    });
+
+    test('throwsA - correct error', () {
+      var completer = new Completer();
+      completer.completeError('X');
+      shouldPass(completer.future, throwsA(equals('X')), isAsync: true);
+    });
+
+    test('throwsA - wrong error', () {
+      var completer = new Completer();
+      completer.completeError('X');
+      shouldFail(completer.future, throwsA(equals('Y')),
+          "Expected: 'Y' Actual: 'X' "
+          "Which: is different. "
+          "Expected: Y Actual: X ^ Differ at offset 0",
+          isAsync: true);
+    });
+  });
+
+  group('Predicate Matchers', () {
+    test('isInstanceOf', () {
+      shouldFail(0, predicate((x) => x is String, "an instance of String"),
+          "Expected: an instance of String Actual: <0>");
+      shouldPass('cow', predicate((x) => x is String, "an instance of String"));
+    });
+  });
+
+  group('exception/error matchers', () {
+    // TODO(gram): extend this to more types; for now this is just
+    // the types being added in this CL.
+
+    test('throwsCyclicInitializationError', () {
+      expect(() => _Bicycle.foo, throwsCyclicInitializationError);
+    });
+
+    test('throwsAbstractClassInstantiationError', () {
+      expect(() => new _AbstractClass(), throwsAbstractClassInstantiationError);
+    });
+
+    test('throwsConcurrentModificationError', () {
+      expect(() {
+        var a = { 'foo': 'bar' };
+        for (var k in a.keys) {
+          a.remove(k);
+        }
+      }, throwsConcurrentModificationError);
+      });
+
+    test('throwsNullThrownError', () {
+      expect(() => throw null, throwsNullThrownError);
+    });
+
+    test('throwsFallThroughError', () {
+      expect(() {
+        var a = 0;
+        switch (a) {
+          case 0:
+            a += 1;
+          case 1:
+            return;
+        }
+      }, throwsFallThroughError);
+    });
+  });
+}
+
+class _Bicycle {
+  static final foo = bar();
+
+  static bar() {
+    return foo + 1;
+  }
+}
+
+abstract class _AbstractClass {
+}
diff --git a/pkg/matcher/test/test_common.dart b/pkg/matcher/test/test_common.dart
index 93f45f3..562786d 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> {
-  final int count;
-
+class SimpleIterable extends IterableBase {
+  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<int> {
+class SimpleIterator implements Iterator {
   int _count;
   int _current;
 
-  _SimpleIterator(this._count);
+  SimpleIterator(this._count);
 
   bool moveNext() {
     if (_count > 0) {
@@ -54,6 +54,6 @@
     return false;
   }
 
-  int get current => _current;
+  get current => _current;
 }
 
diff --git a/pkg/observe/lib/src/bindable.dart b/pkg/observe/lib/src/bindable.dart
index 4b628a60..636ef30 100644
--- a/pkg/observe/lib/src/bindable.dart
+++ b/pkg/observe/lib/src/bindable.dart
@@ -9,10 +9,8 @@
 // TODO(jmesserly): Node.bind polyfill calls this "observable"
 abstract class Bindable {
   // TODO(jmesserly): since we have "value", should open be a void method?
-  // Dart note: changed setValue to be "set value" and discardChanges() to
-  // be "get value". Also "set value" implies discard changes.
-  // TOOD(jmesserly): is this change too subtle? Is there any other way to
-  // make Bindable friendly in a world with getters/setters?
+  // TODO(jmesserly): not sure how I feel about open taking a variable number
+  // of arguments, but it's the easiest way to make CompoundObserver work.
 
   /// Initiates observation and returns the initial value.
   /// The callback will be called with the updated [value].
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index d6bf814..cfaab18 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -41,7 +41,6 @@
   /// Sets the value at this path.
   void set value(Object newValue) {
     if (_path != null) _path.setValueFrom(_object, newValue);
-    _discardChanges();
   }
 
   int get _reportArgumentCount => 2;
@@ -432,7 +431,7 @@
       throw new StateError('Cannot add observers once started.');
     }
 
-    observer.open((_) => deliver());
+    observer.open(_deliver);
     _observed..add(_observerSentinel)..add(observer);
   }
 
@@ -533,7 +532,10 @@
     return _value;
   }
 
-  get value => _discardChanges();
+  get value {
+    _check(skipChanges: true);
+    return _value;
+  }
 
   void close() {
     if (!_isOpen) return;
@@ -543,13 +545,10 @@
     _notifyCallback = null;
   }
 
-  _discardChanges() {
-    _check(skipChanges: true);
-    return _value;
+  void _deliver(_) {
+    if (_isOpen) _dirtyCheck();
   }
 
-  bool deliver() => _isOpen ? _dirtyCheck() : false;
-
   bool _dirtyCheck() {
     var cycles = 0;
     while (cycles < _MAX_DIRTY_CHECK_CYCLES && _check()) {
diff --git a/pkg/observe/lib/transformer.dart b/pkg/observe/lib/transformer.dart
index 199bae6..776cc3f 100644
--- a/pkg/observe/lib/transformer.dart
+++ b/pkg/observe/lib/transformer.dart
@@ -8,7 +8,6 @@
 
 import 'dart:async';
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/parser.dart';
@@ -85,7 +84,7 @@
 
 TextEditTransaction _transformCompilationUnit(
     String inputCode, SourceFile sourceFile, TransformLogger logger) {
-  var unit = parseCompilationUnit(inputCode, suppressErrors: true);
+  var unit = _parseCompilationUnit(inputCode);
   var code = new TextEditTransaction(inputCode, sourceFile);
   for (var directive in unit.directives) {
     if (directive is LibraryDirective && _hasObservable(directive)) {
@@ -110,6 +109,21 @@
   return code;
 }
 
+/// Parse [code] using analyzer.
+CompilationUnit _parseCompilationUnit(String code) {
+  var errorListener = new _ErrorCollector();
+  var reader = new CharSequenceReader(code);
+  var scanner = new Scanner(null, reader, errorListener);
+  var token = scanner.tokenize();
+  var parser = new Parser(null, errorListener);
+  return parser.parseCompilationUnit(token);
+}
+
+class _ErrorCollector extends AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+  onError(error) => errors.add(error);
+}
+
 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
 
 /// True if the node has the `@observable` or `@published` annotation.
@@ -129,7 +143,7 @@
 bool _isAnnotationContant(Annotation m, String name) =>
     m.name.name == name && m.constructorName == null && m.arguments == null;
 
-bool _isAnnotationType(Annotation m, String name) => m.name.name == name;
+bool _isAnnotationType(Annotation m, String name) => m.name == name;
 
 void _transformClass(ClassDeclaration cls, TextEditTransaction code,
     SourceFile file, TransformLogger logger) {
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index 21e31ec..408a285 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.1-dev
+version: 0.10.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -9,7 +9,7 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: '>=0.15.6 <0.16.0'
+  analyzer: '>=0.13.0 <0.14.0'
   barback: '>=0.9.0 <0.15.0'
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 25ff63e..674f8b2 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -327,7 +327,7 @@
     expect(model._foo, 'hi');
     expect(observer.value, 'hi');
 
-    expect(model.log, [#foo, const Symbol('foo='), #foo, #foo]);
+    expect(model.log, [#foo, const Symbol('foo='), #foo]);
 
     // These shouldn't throw
     observer = new PathObserver(model, 'bar');
@@ -345,7 +345,7 @@
     model.log.clear();
 
     observer.value = 'hi';
-    expect(model.log, ['[]= foo hi', '[] foo']);
+    expect(model.log, ['[]= foo hi']);
     expect(model._foo, 'hi');
 
     expect(observer.value, 'hi');
@@ -358,7 +358,7 @@
     model.log.clear();
 
     observer.value = 42;
-    expect(model.log, ['[]= bar 42', '[] bar']);
+    expect(model.log, ['[]= bar 42']);
     model.log.clear();
   });
 }
diff --git a/pkg/pkg.status b/pkg/pkg.status
index d8666d6..6a5b814 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -9,7 +9,6 @@
 */*/packages/*/*: Skip
 */*/*/packages/*/*: Skip
 */*/*/*/packages/*/*: Skip
-*/*/*/*/*/packages/*/*: Skip
 
 # Skip non-test files ending with "_test".
 scheduled_test/lib/*: Skip
@@ -23,8 +22,6 @@
 [ $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
-
-[ $compiler == none && ($runtime == dartium) ]
 polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 18931
 polymer/test/attr_mustache_test: Pass, RuntimeError # Issue 18931
 polymer/test/bind_test: Pass, RuntimeError # Issue 18931
@@ -83,8 +80,8 @@
 [ $compiler == dart2js && $checked ]
 crypto/test/base64_test: Slow, Pass
 
-[ $checked && $runtime == drt ]
-polymer/test/event_handlers_test: Pass, RuntimeError # Issue 19190
+[ $compiler == dart2js && $checked && $runtime == drt ]
+polymer/test/event_handlers_test: RuntimeError # Issue 19190
 
 [ $compiler == dart2js && $checked && $runtime == ie9 ]
 crypto/test/base64_test: Timeout # Issue 12486
@@ -110,7 +107,6 @@
 [ $runtime == vm || $runtime == d8 || $runtime == jsshell ]
 polymer/example: Skip # Uses dart:html
 polymer/e2e_test: Skip # Uses dart:html
-polymer/test/auto_binding_test: Skip # uses dart:html
 polymer/test/attr_deserialize_test: Skip # uses dart:html
 polymer/test/attr_mustache_test: Skip #uses dart:html
 polymer/test/bind_test: Skip # uses dart:html
@@ -158,10 +154,7 @@
 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/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: RuntimeError # Issue 19265
+matcher/test/matchers_test: RuntimeError # Issue 17762
 
 [ $ie ]
 polymer/test/noscript_test: RuntimeError, Pass # Issue 13260
@@ -171,37 +164,6 @@
 [ $runtime == ie10 ]
 typed_data/test/typed_buffers_test/none: Fail # Issue   17607 (I put this here explicitly, since this is not the same as on ie9)
 polymer/test/register_test: Fail # Issue 18870
-polymer/test/auto_binding_test: Pass, RuntimeError # Issue 19265
-polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 19265
-polymer/test/attr_mustache_test: Pass, RuntimeError # Issue 19265
-polymer/test/bind_test: Pass, RuntimeError # Issue 19265
-polymer/test/bind_mdv_test: Pass, RuntimeError # Issue 19265
-polymer/test/custom_event_test: Pass, RuntimeError # Issue 19265
-polymer/test/entered_view_test: Pass, RuntimeError # Issue 19265
-polymer/test/event_handlers_test: Pass, RuntimeError # Issue 19265
-polymer/test/event_path_declarative_test: Pass, RuntimeError # Issue 19265
-polymer/test/event_path_test: Pass, RuntimeError # Issue 19265
-polymer/test/events_test: Pass, RuntimeError # Issue 19265
-polymer/test/instance_attrs_test: Pass, RuntimeError # Issue 19265
-polymer/test/js_interop_test: Pass, RuntimeError # Issue 19265
-polymer/test/mirror_loader_test: Pass, RuntimeError # Issue 19265
-polymer/test/nested_binding_test: Pass, RuntimeError # Issue 19265
-polymer/test/noscript_test: Pass, RuntimeError # Issue 19265
-polymer/test/prop_attr_bind_reflection_test: Pass, RuntimeError # Issue 19265
-polymer/test/prop_attr_reflection_test: Pass, RuntimeError # Issue 19265
-polymer/test/property_change_test: Pass, RuntimeError # Issue 19265
-polymer/test/property_observe_test: Pass, RuntimeError # Issue 19265
-polymer/test/publish_attributes_test: Pass, RuntimeError # Issue 19265
-polymer/test/publish_inherited_properties_test: Pass, RuntimeError # Issue 19265
-polymer/test/take_attributes_test: Pass, RuntimeError # Issue 19265
-polymer/test/template_distribute_dynamic_test: Pass, RuntimeError # Issue 19265
-polymer/test/unbind_test: Pass, RuntimeError # Issue 19265
-polymer/e2e_test/*: Pass, RuntimeError # Issue 19265
-polymer_expressions/*: Pass, RuntimeError # Issue 19265
-template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
-
-[ $runtime == ie11 ]
-polymer/test/event_handlers_test: RuntimeError, Timeout # Issue 19265
 
 [ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
@@ -279,7 +241,6 @@
 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.
@@ -370,6 +331,10 @@
 polymer/e2e_test/canonicalization/test/dir/dev2_test: RuntimeError # Issue 17596
 polymer/e2e_test/canonicalization/test/dir/deploy1_test: Fail, OK # tests deploy only behavior
 polymer/e2e_test/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
+polymer/test/custom_event_test: Pass, Crash # 14360
+
+[ $compiler == none && ( $runtime == dartium || $runtime == drt ) && $checked ]
+polymer/test/custom_event_test: Skip # http://dartbug.com/15517
 
 [ $runtime == vm ]
 # Skip tests on the VM if the package depends on dart:html
@@ -394,7 +359,7 @@
 source_maps/test/parser_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-matcher/test/deprecated_matchers_test: StaticWarning # testing error creating abstract class
+matcher/test/matchers_test: StaticWarning, OK # testing error creating abstract class
 third_party/angular_tests/vm_test: StaticWarning # Uses removed APIs. See issue 18733.
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index f66e925..836631d 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -11,14 +11,11 @@
 [ $use_repository_packages ]
 pkg/analyzer: PubGetError
 pkg/browser: PubGetError
-pkg/polymer_expressions: PubGetError # unreleased 0.11.0
 pkg/third_party/html5lib: PubGetError # angular needs to be updated
 samples/third_party/angular_todo: Fail # angular needs to be updated
 
 [ $use_public_packages ]
 samples/third_party/angular_todo: Pass, Slow
-pkg/polymer: PubGetError # unreleased -dev dependency
-pkg/polymer_expressions: PubGetError # unreleased -dev dependency
 
 [ $use_public_packages && $builder_tag == russian ]
 samples/third_party/todomvc: Fail # Issue 18104
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index faa38e4..a1fb57e 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,16 +4,6 @@
 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
-  * 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.
-
-#### Pub version 0.10.0+1
-  * Better error message on failures in pub-serve/pub-build when pubspec.yaml
-    is missing or has a wrong configuration for the polymer transformers.
-
 #### Pub version 0.10.0
   * Interop with polymer-js elements now works.
   * Polymer polyfills are now consolidated in package:web_components, which is
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index e7ab464..efa6d5f 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -37,15 +37,14 @@
 /// Tips for converting your apps from Web UI to Polymer.dart.
 library polymer;
 
-// Last ported from: Fri May 30 12:45:10 2014 -0700
-// https://github.com/Polymer/polymer-dev/tree/32cc3e470e8ed760a9e596a24fe9b3ac2a87737c
-
-// Note: we are still missing some tests for new features. Use
-// git diff 37eea00e13b9f86ab21c85a955585e8e4237e3d2 test
-// from polymer-dev to see the changes.
+// Last ported from:
+// https://github.com/Polymer/polymer-dev/tree/37eea00e13b9f86ab21c85a955585e8e4237e3d2
+// TODO(jmesserly): we need to do a redundancy check. Some code like the FOUC
+// protection seems out of date, as if left over from the older
+// b7200854b2441a22ce89f6563963f36c50f5150d baseline.
 
 import 'dart:async';
-import 'dart:collection';
+import 'dart:collection' show HashMap, HashSet;
 import 'dart:html';
 import 'dart:js' as js show context;
 import 'dart:js' hide context;
@@ -73,20 +72,17 @@
 import 'package:observe/observe.dart';
 import 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 import 'package:polymer_expressions/polymer_expressions.dart'
-    as polymer_expressions;
+    show PolymerExpressions;
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:template_binding/template_binding.dart';
 
-import 'auto_binding.dart';
 import 'deserialize.dart' as deserialize;
 import 'src/mirror_loader.dart' as loader; // ** see important note above
 
 export 'package:observe/observe.dart';
 export 'package:observe/html.dart';
-export 'auto_binding.dart';
 
 part 'src/declaration.dart';
-part 'src/events.dart';
 part 'src/instance.dart';
 part 'src/job.dart';
 part 'src/loader.dart';
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index e0fd775..9a90ea1 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -18,8 +18,8 @@
 
 <!-- unminfied for debugging:
 <script src="../../packages/web_components/platform.concat.js"></script>
-<link rel="import" href="src/js/polymer/layout.html">
 <script src="src/js/polymer/polymer.concat.js"></script>
+<link rel="import" href="src/js/polymer/polymer-body.html">
 -->
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
diff --git a/pkg/polymer/lib/polymer_element.dart b/pkg/polymer/lib/polymer_element.dart
new file mode 100644
index 0000000..ac98793
--- /dev/null
+++ b/pkg/polymer/lib/polymer_element.dart
@@ -0,0 +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.
+
+library polymer.polymer_element;
+
+export 'polymer.dart' show PolymerElement;
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 77e8db7..2d89f19 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -172,6 +172,22 @@
   return path.posix.joinAll(path.split(assetPath));
 }
 
+
+/// Parse [code] using analyzer.
+CompilationUnit parseCompilationUnit(String code) {
+  var errorListener = new _ErrorCollector();
+  var reader = new CharSequenceReader(code);
+  var scanner = new Scanner(null, reader, errorListener);
+  var token = scanner.tokenize();
+  var parser = new Parser(null, errorListener);
+  return parser.parseCompilationUnit(token);
+}
+
+class _ErrorCollector extends AnalysisErrorListener {
+  final errors = <AnalysisError>[];
+  onError(error) => errors.add(error);
+}
+
 /// These names have meaning in SVG or MathML, so they aren't allowed as custom
 /// tags. See [isCustomTagName].
 const invalidTagNames = const {
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index 71ab67c..c5624d1 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -8,7 +8,6 @@
 import 'dart:async';
 import 'dart:convert';
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/assets.dart';
@@ -52,7 +51,7 @@
       experimentalBootstrap = document.querySelectorAll('link').any((link) =>
           link.attributes['rel'] == 'import' &&
           link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML);
-      changed = _extractScripts(document);
+      changed = _extractScripts(document, docId);
       return _visitImports(document);
     }).then((importsFound) {
       changed = changed || importsFound;
@@ -145,8 +144,7 @@
     return readAsHtml(id, transform).then((doc) {
       new _UrlNormalizer(transform, id).visit(doc);
       return _visitImports(doc).then((_) {
-        // _UrlNormalizer already ensures there is a library name.
-        _extractScripts(doc, injectLibraryName: false);
+        _extractScripts(doc, id);
 
         // TODO(jmesserly): figure out how this is working in vulcanizer.
         // Do they produce a <body> tag with a <head> and <body> inside?
@@ -200,7 +198,7 @@
   /// to be able to compile them.
   ///
   /// This also validates that there weren't any duplicate scripts.
-  bool _extractScripts(Document doc, {bool injectLibraryName: true}) {
+  bool _extractScripts(Document doc, AssetId sourceId) {
     bool changed = false;
     for (var script in doc.querySelectorAll('script')) {
       if (script.attributes['type'] != TYPE_DART) continue;
@@ -217,8 +215,21 @@
       changed = true;
 
       var newId = docId.addExtension('.$count.dart');
-      if (injectLibraryName && !_hasLibraryDirective(code)) {
-        var libName = _libraryNameFor(docId, count);
+      // TODO(jmesserly): consolidate this check with our other parsing of the
+      // Dart code, so we only parse it once.
+      if (!_hasLibraryDirective(code)) {
+        // Inject a library tag with an appropriate library name.
+
+        // Transform AssetId into a package name. For example:
+        //   myPkgName|lib/foo/bar.html -> myPkgName.foo.bar_html
+        //   myPkgName|web/foo/bar.html -> myPkgName.web.foo.bar_html
+        // This should roughly match the recommended library name conventions.
+        var libName = '${path.withoutExtension(sourceId.path)}_'
+            '${path.extension(sourceId.path).substring(1)}';
+        if (libName.startsWith('lib/')) libName = libName.substring(4);
+        libName = libName.replaceAll('/', '.').replaceAll('-', '_');
+        libName = '${sourceId.package}.${libName}_$count';
+
         code = "library $libName;\n$code";
       }
       extractedFiles.add(newId);
@@ -228,24 +239,9 @@
   }
 }
 
-/// Transform AssetId into a library name. For example:
-///
-///     myPkgName|lib/foo/bar.html -> myPkgName.foo.bar_html
-///     myPkgName|web/foo/bar.html -> myPkgName.web.foo.bar_html
-///
-/// This should roughly match the recommended library name conventions.
-String _libraryNameFor(AssetId id, int suffix) {
-  var name = '${path.withoutExtension(id.path)}_'
-      '${path.extension(id.path).substring(1)}';
-  if (name.startsWith('lib/')) name = name.substring(4);
-  name = name.replaceAll('/', '.').replaceAll('-', '_');
-  return '${id.package}.${name}_$suffix';
-}
-
 /// Parse [code] and determine whether it has a library directive.
 bool _hasLibraryDirective(String code) =>
-    parseDirectives(code, suppressErrors: true)
-        .directives.any((d) => d is LibraryDirective);
+    parseCompilationUnit(code).directives.any((d) => d is LibraryDirective);
 
 
 /// Recursively inlines the contents of HTML imports. Produces as output a
@@ -283,9 +279,6 @@
   /// Asset where the original content (and original url) was found.
   final AssetId sourceId;
 
-  /// Counter used to ensure that every library name we inject is unique.
-  int _count = 0;
-
   _UrlNormalizer(this.transform, this.sourceId);
 
   visitElement(Element node) {
@@ -299,8 +292,7 @@
     if (node.localName == 'style') {
       node.text = visitCss(node.text);
     } else if (node.localName == 'script' &&
-        node.attributes['type'] == TYPE_DART &&
-        !node.attributes.containsKey('src')) {
+        node.attributes['type'] == TYPE_DART) {
       // TODO(jmesserly): we might need to visit JS too to handle ES Harmony
       // modules.
       node.text = visitInlineDart(node.text);
@@ -329,10 +321,10 @@
   }
 
   String visitInlineDart(String code) {
-    var unit = parseDirectives(code, suppressErrors: true);
+    var unit = parseCompilationUnit(code);
     var file = new SourceFile.text(spanUrlFor(sourceId, transform), code);
     var output = new TextEditTransaction(code, file);
-    var foundLibraryDirective = false;
+
     for (Directive directive in unit.directives) {
       if (directive is UriBasedDirective) {
         var uri = directive.uri.stringValue;
@@ -347,17 +339,9 @@
         if (newUri != uri) {
           output.edit(span.start.offset, span.end.offset, "'$newUri'");
         }
-      } else if (directive is LibraryDirective) {
-        foundLibraryDirective = true;
       }
     }
 
-    if (!foundLibraryDirective) {
-      // Ensure all inline scripts also have a library name.
-      var libName = _libraryNameFor(sourceId, _count++);
-      output.edit(0, 0, "library $libName;\n");
-    }
-
     if (!output.hasEdits) return code;
 
     // TODO(sigmund): emit source maps when barback supports it (see
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 8127eda..b633360 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -45,47 +45,7 @@
   final TransformOptions options;
 
   ScriptCompactor(this.options, {String sdkDir})
-      // TODO(sigmund): consider restoring here a resolver that uses the real
-      // SDK once the analyzer is lazy and only an resolves what it needs:
-      //: resolvers = new Resolvers(sdkDir != null ? sdkDir : dartSdkDirectory);
-      : resolvers = new Resolvers.fromMock({
-        // The list of types below is derived from:
-        //   * types we use via our smoke queries, including HtmlElement and
-        //     types from `_typeHandlers` (deserialize.dart)
-        //   * types that are used internally by the resolver (see
-        //   _initializeFrom in resolver.dart).
-        'dart:core': '''
-            library dart.core;
-            class Object {}
-            class Function {}
-            class StackTrace {}
-            class Symbol {}
-            class Type {}
-
-            class String extends Object {}
-            class bool extends Object {}
-            class num extends Object {}
-            class int extends num {}
-            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");
-
-            class List<V> extends Object {}
-            class Map<K, V> extends Object {}
-            ''',
-        'dart:html': '''
-            library dart.html;
-            class HtmlElement {}
-            ''',
-      });
-
-
+      : resolvers = new Resolvers(sdkDir != null ? sdkDir : dartSdkDirectory);
 
   /// Only run on entry point .html files.
   // TODO(nweiz): This should just take an AssetId when barback <0.13.0 support
@@ -224,7 +184,7 @@
   void _extractUsesOfMirrors(_) {
     // Generate getters and setters needed to evaluate polymer expressions, and
     // extract information about published attributes.
-    new _HtmlExtractor(logger, generator, publishedAttributes).visit(document);
+    new _HtmlExtractor(generator, publishedAttributes).visit(document);
 
     // Create a recorder that uses analyzer data to feed data to [generator].
     var recorder = new Recorder(generator,
@@ -483,11 +443,9 @@
   final Map<String, List<String>> publishedAttributes;
   final SmokeCodeGenerator generator;
   final _SubExpressionVisitor visitor;
-  final TransformLogger logger;
   bool _inTemplate = false;
 
-  _HtmlExtractor(this.logger, SmokeCodeGenerator generator,
-      this.publishedAttributes)
+  _HtmlExtractor(SmokeCodeGenerator generator, this.publishedAttributes)
       : generator = generator,
         visitor = new _SubExpressionVisitor(generator);
 
@@ -513,7 +471,7 @@
     var bindings = _Mustaches.parse(node.data);
     if (bindings == null) return;
     for (var e in bindings.expressions) {
-      _addExpression(e, false, false, node.sourceSpan);
+      _addExpression(e, false, false);
     }
   }
 
@@ -548,24 +506,20 @@
             tag == 'textarea' && name == 'value');
       }
       for (var exp in bindings.expressions) {
-        _addExpression(exp, isEvent, isTwoWay, node.sourceSpan);
+        _addExpression(exp, isEvent, isTwoWay);
       }
     });
   }
 
-  void _addExpression(String stringExpression, bool inEvent, bool isTwoWay,
-      span) {
-
+  void _addExpression(String stringExpression, bool inEvent, bool isTwoWay) {
     if (inEvent) {
-      if (stringExpression.startsWith('@')) {
-        logger.warning('event bindings with @ are no longer supported',
-            span: span);
+      if (!stringExpression.startsWith("@")) {
+        if (stringExpression == '') return;
+        generator.addGetter(stringExpression);
+        generator.addSymbol(stringExpression);
         return;
       }
-
-      if (stringExpression == '') return;
-      generator.addGetter(stringExpression);
-      generator.addSymbol(stringExpression);
+      stringExpression = stringExpression.substring(1);
     }
     visitor.run(pe.parse(stringExpression), isTwoWay);
   }
@@ -747,7 +701,7 @@
 
 /// Retrieves all top-level methods that are visible if you were to import
 /// [lib]. This includes exported methods from other libraries too.
-List<FunctionElement> _visibleTopLevelMethodsOf(LibraryElement lib) {
+List<ClassElement> _visibleTopLevelMethodsOf(LibraryElement lib) {
   var result = [];
   result.addAll(lib.units.expand((u) => u.functions));
   for (var e in lib.exports) {
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index 0ae6641..e79f8bd 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -9,9 +9,6 @@
 /// The data associated with a polymer-element declaration, if it is backed
 /// by a Dart class instead of a JavaScript prototype.
 class PolymerDeclaration {
-  /// The one syntax to rule them all.
-  static final BindingDelegate _polymerSyntax = new PolymerExpressions();
-
   /// The polymer-element for this declaration.
   final HtmlElement element;
 
@@ -43,22 +40,14 @@
 
   Map<String, Object> _instanceAttributes;
 
-  /// A set of properties that should be automatically reflected to attributes.
-  /// Typically this is used for CSS styling. If none, this variable will be
-  /// left as null.
-  Set<String> _reflect;
-
   List<Element> _sheets;
   List<Element> get sheets => _sheets;
 
   List<Element> _styles;
   List<Element> get styles => _styles;
 
-  // The default syntax for polymer-elements.
-  PolymerExpressions syntax = _polymerSyntax;
-
   DocumentFragment get templateContent {
-    final template = fetchTemplate();
+    final template = element.querySelector('template');
     return template != null ? templateBind(template).content : null;
   }
 
@@ -73,15 +62,19 @@
   String get extendee => superDeclaration != null ?
       superDeclaration.name : null;
 
-  /// The root URI for assets.
-  Uri _rootUri;
-
   // Dart note: since polymer-element is handled in JS now, we have a simplified
   // flow for registering. We don't need to wait for the supertype or the code
   // to be noticed.
   PolymerDeclaration(this.element, this.name, this.type, this.superDeclaration);
 
   void register() {
+    // build prototype combining extendee, Polymer base, and named api
+    buildType();
+
+    // back reference declaration element
+    // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
+    _declarations[name] = this;
+
     // more declarative features
     desugar();
     // register our custom element
@@ -92,14 +85,12 @@
     // publishConstructor();
   }
 
-  /// Implement various declarative features.
-  // Dart note: this merges "buildPrototype" "desugarBeforeChaining" and
-  // "desugarAfterChaining", because we don't have prototypes.
-  void desugar() {
-
-    // back reference declaration element
-    _declarations[name] = this;
-
+  /// Gets the Dart type registered for this name, and sets up declarative
+  /// features. Fills in the [type] and [supertype] fields.
+  ///
+  /// *Note*: unlike the JavaScript version, we do not have to metaprogram the
+  /// prototype, which simplifies this method.
+  void buildType() {
     // transcribe `attributes` declarations onto own prototype's `publish`
     publishAttributes(superDeclaration);
 
@@ -110,20 +101,32 @@
     // desugar compound observer syntax, e.g. @ObserveProperty('a b c')
     explodeObservers();
 
-    // install mdv delegate on template
-    installBindingDelegate(fetchTemplate());
-    // install external stylesheets as if they are inline
-    installSheets();
-    // adjust any paths in dom from imports
-    resolveElementPaths(element);
+    // Skip the rest in Dart:
+    // chain various meta-data objects to inherited versions
+    // chain custom api to inherited
+    // build side-chained lists to optimize iterations
+    // inherit publishing meta-data
+    // x-platform fixup
+  }
+
+  /// Implement various declarative features.
+  void desugar() {
     // compile list of attributes to copy to instances
     accumulateInstanceAttributes();
     // parse on-* delegates declared on `this` element
     parseHostEvents();
-    // install a helper method this.resolvePath to aid in
-    // setting resource urls. e.g.
+    // install external stylesheets as if they are inline
+    installSheets();
+
+    adjustShadowElement();
+
+    // TODO(sorvell): install a helper method this.resolvePath to aid in
+    // setting resource paths. e.g.
     // this.$.image.src = this.resolvePath('images/foo.png')
-    initResolvePath();
+    // Potentially remove when spec bug is addressed.
+    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=21407
+    // TODO(jmesserly): resolvePath not ported, see first comment in this class.
+
     // under ShadowDOMPolyfill, transforms to approximate missing CSS features
     _shimShadowDomStyling(templateContent, name, extendee);
 
@@ -134,6 +137,22 @@
     }
   }
 
+  // TODO(sorvell): remove when spec addressed:
+  // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22460
+  // make <shadow></shadow> be <shadow><content></content></shadow>
+  void adjustShadowElement() {
+    // TODO(sorvell): avoid under SD polyfill until this bug is addressed:
+    // https://github.com/Polymer/ShadowDOM/issues/297
+    if (!_hasShadowDomPolyfill) {
+      final content = templateContent;
+      if (content == null) return;
+
+      for (var s in content.querySelectorAll('shadow')) {
+        if (s.nodes.isEmpty) s.append(new ContentElement());
+      }
+    }
+  }
+
   void registerType(String name) {
     var baseTag;
     var decl = this;
@@ -141,65 +160,19 @@
       baseTag = decl.element.attributes['extends'];
       decl = decl.superDeclaration;
     }
-    document.registerElement(name, type, extendsTag: baseTag);
-  }
-
-  // from declaration/mdv.js
-  Element fetchTemplate() => element.querySelector('template');
-
-  void installBindingDelegate(Element template) {
-    if (template != null) {
-      templateBind(template).bindingDelegate = this.syntax;
-    }
-  }
-
-  // from declaration/path.js
-  void resolveElementPaths(Node node) {
-    if (_Platform == null) return;
-    _Platform['urlResolver'].callMethod('resolveDom', [node]);
-  }
-
-  // Dart note: renamed from "addResolvePathApi".
-  void initResolvePath() {
-    // let assetpath attribute modify the resolve path
-    var assetPath = element.attributes['assetpath'];
-    if (assetPath == null) assetPath = '';
-    var base = Uri.parse(element.ownerDocument.baseUri);
-    _rootUri = base.resolve(assetPath);
-  }
-
-  String resolvePath(String urlPath, [baseUrlOrString]) {
-    Uri base;
-    if (baseUrlOrString == null) {
-      // Dart note: this enforces the same invariant as JS, where you need to
-      // call addResolvePathApi first.
-      if (_rootUri == null) {
-        throw new StateError('call initResolvePath before calling resolvePath');
-      }
-      base = _rootUri;
-    } else if (baseUrlOrString is Uri) {
-      base = baseUrlOrString;
-    } else {
-      base = Uri.parse(baseUrlOrString);
-    }
-    return base.resolve(urlPath).toString();
+    document.register(name, type, extendsTag: baseTag);
   }
 
   void publishAttributes(PolymerDeclaration superDecl) {
     // get properties to publish
-    if (superDecl != null) {
+    if (superDecl != null && superDecl._publish != null) {
       // Dart note: even though we walk the type hierarchy in
       // _getPublishedProperties, this will additionally include any names
       // published via the `attributes` attribute.
-      if (superDecl._publish != null) {
-        _publish = new Map.from(superDecl._publish);
-      }
-      if (superDecl._reflect != null) {
-        _reflect = new Set.from(superDecl._reflect);
-      }
+      _publish = new Map.from(superDecl._publish);
     }
 
-    _getPublishedProperties(type);
+    _publish = _getPublishedProperties(type, _publish);
 
     // merge names from 'attributes' attribute
     var attrs = element.attributes['attributes'];
@@ -235,26 +208,6 @@
     // but don't override
   }
 
-  void _getPublishedProperties(Type type) {
-    var options = const smoke.QueryOptions(includeInherited: true,
-        includeUpTo: HtmlElement, withAnnotations: const [PublishedProperty]);
-    for (var decl in smoke.query(type, options)) {
-      if (decl.isFinal) continue;
-      if (_publish == null) _publish = {};
-      _publish[new PropertyPath([decl.name])] = decl;
-
-      // Should we reflect the property value to the attribute automatically?
-      if (decl.annotations
-          .where((a) => a is PublishedProperty)
-          .any((a) => a.reflect)) {
-
-        if (_reflect == null) _reflect = new Set();
-        _reflect.add(smoke.symbolToName(decl.name));
-      }
-    }
-  }
-
-
   void accumulateInstanceAttributes() {
     // inherit instance attributes
     _instanceAttributes = new Map<String, Object>();
@@ -273,15 +226,8 @@
   static bool isInstanceAttribute(name) {
     // do not clone these attributes onto instances
     final blackList = const {
-      'name': 1,
-      'extends': 1,
-      'constructor': 1,
-      'noscript': 1,
-      'assetpath': 1,
-      'cache-csstext': 1,
-      // add ATTRIBUTES_ATTRIBUTE to the blacklist
-      'attributes': 1,
-    };
+        'name': 1, 'extends': 1, 'constructor': 1, 'noscript': 1,
+        'attributes': 1};
 
     return !blackList.containsKey(name) && !name.startsWith('on-');
   }
@@ -309,10 +255,6 @@
     return (url.split('/')..removeLast()..add('')).join('/');
   }
 
-  // Dart note: loadStyles, convertSheetsToStyles, copySheetAttribute and
-  // findLoadableStyles are not ported because they're handled by Polymer JS
-  // before we get into [register].
-
   /// Install external stylesheets loaded in <element> elements into the
   /// element's template.
   void installSheets() {
@@ -348,10 +290,9 @@
         cssText..write(_cssTextFromSheet(sheet))..write('\n');
       }
       if (cssText.length > 0) {
-        var style = element.ownerDocument.createElement('style')
-            ..text = '$cssText';
-
-        content.insertBefore(style, content.firstChild);
+        content.insertBefore(
+            new StyleElement()..text = '$cssText',
+            content.firstChild);
       }
     }
   }
@@ -461,19 +402,42 @@
 bool _isRegistered(String name) => _declarations.containsKey(name);
 PolymerDeclaration _getDeclaration(String name) => _declarations[name];
 
+Map<PropertyPath, smoke.Declaration> _getPublishedProperties(
+    Type type, Map<PropertyPath, smoke.Declaration> props) {
+  var options = const smoke.QueryOptions(includeInherited: true,
+      includeUpTo: HtmlElement, withAnnotations: const [PublishedProperty]);
+  for (var decl in smoke.query(type, options)) {
+    if (decl.isFinal) continue;
+    if (props == null) props = {};
+    props[new PropertyPath([decl.name])] = decl;
+  }
+  return props;
+}
+
+/// Attribute prefix used for declarative event handlers.
+const _EVENT_PREFIX = 'on-';
+
+/// Whether an attribute declares an event.
+bool _hasEventPrefix(String attr) => attr.startsWith(_EVENT_PREFIX);
+
+String _removeEventPrefix(String name) => name.substring(_EVENT_PREFIX.length);
+
 /// Using Polymer's platform/src/ShadowCSS.js passing the style tag's content.
 void _shimShadowDomStyling(DocumentFragment template, String name,
     String extendee) {
-  if (template == null || _ShadowCss == null) return;
+  if (template == null || !_hasShadowDomPolyfill) return;
 
-  _ShadowCss.callMethod('shimStyling', [template, name, extendee]);
+  var platform = js.context['Platform'];
+  if (platform == null) return;
+  var shadowCss = platform['ShadowCSS'];
+  if (shadowCss == null) return;
+  shadowCss.callMethod('shimStyling', [template, name, extendee]);
 }
 
 final bool _hasShadowDomPolyfill = js.context.hasProperty('ShadowDOMPolyfill');
-final JsObject _ShadowCss = _Platform != null ? _Platform['ShadowCSS'] : null;
 
 const _STYLE_SELECTOR = 'style';
-const _SHEET_SELECTOR = 'link[rel=stylesheet]';
+const _SHEET_SELECTOR = '[rel=stylesheet]';
 const _STYLE_GLOBAL_SCOPE = 'global';
 const _SCOPE_ATTR = 'polymer-scope';
 const _STYLE_SCOPE_ATTRIBUTE = 'element';
@@ -521,7 +485,46 @@
   return name.endsWith('Changed') && name != 'attributeChanged';
 }
 
+// TODO(jmesserly): is this list complete?
+final _eventTranslations = const {
+  // TODO(jmesserly): these three Polymer.js translations won't work in Dart,
+  // because we strip the webkit prefix (below). Reconcile.
+  'webkitanimationstart': 'webkitAnimationStart',
+  'webkitanimationend': 'webkitAnimationEnd',
+  'webkittransitionend': 'webkitTransitionEnd',
+
+  'domfocusout': 'DOMFocusOut',
+  'domfocusin': 'DOMFocusIn',
+  'dommousescroll': 'DOMMouseScroll',
+
+  // TODO(jmesserly): Dart specific renames. Reconcile with Polymer.js
+  'animationend': 'webkitAnimationEnd',
+  'animationiteration': 'webkitAnimationIteration',
+  'animationstart': 'webkitAnimationStart',
+  'doubleclick': 'dblclick',
+  'fullscreenchange': 'webkitfullscreenchange',
+  'fullscreenerror': 'webkitfullscreenerror',
+  'keyadded': 'webkitkeyadded',
+  'keyerror': 'webkitkeyerror',
+  'keymessage': 'webkitkeymessage',
+  'needkey': 'webkitneedkey',
+  'speechchange': 'webkitSpeechChange',
+};
+
+final _reverseEventTranslations = () {
+  final map = new Map<String, String>();
+  _eventTranslations.forEach((onName, eventType) {
+    map[eventType] = onName;
+  });
+  return map;
+}();
+
+// Dart note: we need this function because we have additional renames JS does
+// not have. The JS renames are simply case differences, whereas we have ones
+// like doubleclick -> dblclick and stripping the webkit prefix.
+String _eventNameFromType(String eventType) {
+  final result = _reverseEventTranslations[eventType];
+  return result != null ? result : eventType;
+}
 
 final _ATTRIBUTES_REGEX = new RegExp(r'\s|,');
-
-final JsObject _Platform = js.context['Platform'];
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index 6ea826d..4dcca03 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -4,43 +4,18 @@
 
 part of polymer;
 
-/// Use this annotation to publish a field as an attribute.
-///
-/// You can also use [PublishedProperty] to provide additional information,
-/// such as automatically syncing the property back to the attribute.
-///
-/// For example:
+/// Use this annotation to publish a field as an attribute. For example:
 ///
 ///     class MyPlaybackElement extends PolymerElement {
 ///       // This will be available as an HTML attribute, for example:
-///       //
 ///       //     <my-playback volume="11">
-///       //
-///       // It will support initialization and data-binding via <template>:
-///       //
-///       //     <template>
-///       //       <my-playback volume="{{x}}">
-///       //     </template>
-///       //
-///       // If the template is instantiated or given a model, `x` will be
-///       // used for this field and updated whenever `volume` changes.
 ///       @published double volume;
-///
-///       // This will be available as an HTML attribute, like above, but it
-///       // will also serialize values set to the property to the attribute.
-///       // In other words, attributes['volume2'] will contain a serialized
-///       // version of this field.
-///       @PublishedProperty(reflect: true) double volume2;
 ///     }
-///
 const published = const PublishedProperty();
 
 /// An annotation used to publish a field as an attribute. See [published].
 class PublishedProperty extends ObservableProperty {
-  /// Whether the property value should be reflected back to the HTML attribute.
-  final bool reflect;
-
-  const PublishedProperty({this.reflect: false});
+  const PublishedProperty();
 }
 
 /// Use this type to observe a property and have the method be called when it
@@ -72,17 +47,6 @@
   const ObserveProperty(this._names);
 }
 
-
-/// Base class for PolymerElements deriving from HtmlElement.
-///
-/// See [Polymer].
-class PolymerElement extends HtmlElement with Polymer, Observable {
-  PolymerElement.created() : super.created() {
-    polymerCreated();
-  }
-}
-
-
 /// The mixin class for Polymer elements. It provides convenience features on
 /// top of the custom elements web standard.
 ///
@@ -135,65 +99,40 @@
     new JsObject.fromBrowserObject(poly).callMethod('init');
   }
 
-  // Note: these are from src/declaration/import.js
-  // For now proxy to the JS methods, because we want to share the loader with
-  // polymer.js for interop purposes.
-  static Future importElements(Node elementOrFragment) {
-    var completer = new Completer();
-    js.context['Polymer'].callMethod('importElements',
-        [elementOrFragment, () => completer.complete()]);
-    return completer.future;
-  }
+  /// The one syntax to rule them all.
+  static final BindingDelegate _polymerSyntax =
+      new PolymerExpressionsWithEvents();
 
-  static Future importUrls(List urls) {
-    var completer = new Completer();
-    js.context['Polymer'].callMethod('importUrls',
-        [urls, () => completer.complete()]);
-    return completer.future;
-  }
+  static int _preparingElements = 0;
 
-  static final Completer _onReady = new Completer();
+  static final Completer _ready = new Completer();
 
   /// Future indicating that the Polymer library has been loaded and is ready
   /// for use.
-  static Future get onReady => _onReady.future;
+  static Future get onReady => _ready.future;
+
+  PolymerDeclaration _declaration;
 
   /// The most derived `<polymer-element>` declaration for this element.
-  PolymerDeclaration get element => _element;
-  PolymerDeclaration _element;
+  PolymerDeclaration get declaration => _declaration;
 
-  /// Deprecated: use [element] instead.
-  @deprecated PolymerDeclaration get declaration => _element;
-
-  Map<String, StreamSubscription> _namedObservers;
-  List<Iterable<Bindable>> _observers = [];
-
+  Map<String, StreamSubscription> _observers;
   bool _unbound; // lazy-initialized
-  PolymerJob _unbindAllJob;
+  _Job _unbindAllJob;
 
   CompoundObserver _propertyObserver;
-  bool _readied = false;
 
-  /// 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;
+  bool get _elementPrepared => _declaration != null;
 
-  bool get hasBeenAttached => _hasBeenAttached;
-  bool _hasBeenAttached = false;
+  bool get applyAuthorStyles => false;
+  bool get resetStyleInheritance => false;
+  bool get alwaysPrepare => false;
+  bool get preventDispose => false;
 
-  /// Gets the shadow root associated with the corresponding custom element.
-  ///
-  /// This is identical to [shadowRoot], unless there are multiple levels of
-  /// inheritance and they each have their own shadow root. For example,
-  /// this can happen if the base class and subclass both have `<template>` tags
-  /// in their `<polymer-element>` tags.
-  // TODO(jmesserly): should expose this as an immutable map.
-  // Similar issue as $.
-  final Map<String, ShadowRoot> shadowRoots =
-      new LinkedHashMap<String, ShadowRoot>();
+  BindingDelegate syntax = _polymerSyntax;
+
+  /// Shadow roots created by [parseElement]. See [getShadowRoot].
+  final _shadowRoots = new HashMap<String, ShadowRoot>();
 
   /// Map of items in the shadow root(s) by their [Element.id].
   // TODO(jmesserly): various issues:
@@ -207,81 +146,50 @@
   @reflectable final Map<String, Element> $ =
       new ObservableMap<String, Element>();
 
-  /// Use to override the default syntax for polymer-elements.
-  /// By default this will be null, which causes [instanceTemplate] to use
-  /// the template's bindingDelegate or the [element.syntax], in that order.
-  PolymerExpressions get syntax => null;
-
-  bool get _elementPrepared => _element != null;
-
-  /// Retrieves the custom element name. It should be used instead
-  /// of localName, see: https://github.com/Polymer/polymer-dev/issues/26
-  String get _name {
-    if (_element != null) return _element.name;
-    var isAttr = attributes['is'];
-    return (isAttr == null || isAttr == '') ? localName : isAttr;
-  }
-
-  /// By default the data bindings will be cleaned up when this custom element
-  /// is detached from the document. Overriding this to return `true` will
-  /// prevent that from happening.
-  bool get preventDispose => false;
+  /// Gets the shadow root associated with the corresponding custom element.
+  ///
+  /// This is identical to [shadowRoot], unless there are multiple levels of
+  /// inheritance and they each have their own shadow root. For example,
+  /// this can happen if the base class and subclass both have `<template>` tags
+  /// in their `<polymer-element>` tags.
+  // TODO(jmesserly): Polymer does not have this feature. Reconcile.
+  ShadowRoot getShadowRoot(String customTagName) => _shadowRoots[customTagName];
 
   /// If this class is used as a mixin, this method must be called from inside
   /// of the `created()` constructor.
   ///
   /// If this class is a superclass, calling `super.created()` is sufficient.
   void polymerCreated() {
-    var t = nodeBind(this).templateInstance;
-    if (t != null && t.model != null) {
-      window.console.warn('Attributes on $_name were data bound '
-          'prior to Polymer upgrading the element. This may result in '
-          'incorrect binding types.');
-    }
-    prepareElement();
-
-    // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected
-    // https://github.com/Polymer/ShadowDOM/issues/420
-    if (!isTemplateStagingDocument(ownerDocument) || _hasShadowDomPolyfill) {
-      makeElementReady();
+    if (this.ownerDocument.window != null || alwaysPrepare ||
+        _preparingElements > 0) {
+      prepareElement();
     }
   }
 
-  /// *Deprecated* use [shadowRoots] instead.
-  @deprecated
-  ShadowRoot getShadowRoot(String customTagName) => shadowRoots[customTagName];
+  /// Retrieves the custom element name by inspecting the host node.
+  String get _customTagName {
+    var isAttr = attributes['is'];
+    return (isAttr == null || isAttr == '') ? localName : isAttr;
+  }
 
   void prepareElement() {
-    if (_elementPrepared) {
-      window.console.warn('Element already prepared: $_name');
-      return;
-    }
-    // Dart note: get the corresponding <polymer-element> declaration.
-    _element = _getDeclaration(_name);
-    // install property storage
-    createPropertyObserver();
-    // TODO (sorvell): temporarily open observer when created
-    openPropertyObserver();
+    // Dart note: get the _declaration, which also marks _elementPrepared
+    _declaration = _getDeclaration(_customTagName);
+    // do this first so we can observe changes during initialization
+    observeProperties();
     // install boilerplate attributes
     copyInstanceAttributes();
     // process input attributes
     takeAttributes();
     // add event listeners
     addHostListeners();
-  }
-
-  makeElementReady() {
-    if (_readied) return;
-    _readied = true;
-
-    // TODO(sorvell): We could create an entry point here
-    // for the user to compute property values.
+    // guarantees that while preparing, any
+    // sub-elements are also prepared
+    _preparingElements++;
     // process declarative resources
-    parseDeclarations(_element);
-    // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
-    // :unresolved; remove this attribute to be compatible with native
-    // CE.
-    attributes.remove('unresolved');
+    parseDeclarations(_declaration);
+    // decrement semaphore
+    _preparingElements--;
     // user entry point
     ready();
   }
@@ -289,30 +197,14 @@
   /// Called when [prepareElement] is finished.
   void ready() {}
 
-  /// 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.
-  ///
-  /// To use, override this method in your element.
-  void domReady() {}
-
-  void attached() {
+  void enteredView() {
     if (!_elementPrepared) {
-      // Dart specific message for a common issue.
-      throw new StateError('polymerCreated was not called for custom element '
-          '$_name, this should normally be done in the .created() if Polymer '
-          'is used as a mixin.');
+      prepareElement();
     }
-
-    cancelUnbindAll();
-    if (!hasBeenAttached) {
-      _hasBeenAttached = true;
-      async((_) => domReady());
-    }
+    cancelUnbindAll(preventCascade: true);
   }
 
-  void detached() {
+  void leftView() {
     if (!preventDispose) asyncUnbindAll();
   }
 
@@ -328,13 +220,21 @@
   void parseDeclaration(Element elementElement) {
     var template = fetchTemplate(elementElement);
 
+    var root = null;
     if (template != null) {
-      var root = shadowFromTemplate(template);
-
-      var name = elementElement.attributes['name'];
-      if (name == null) return;
-      shadowRoots[name] = root;
+      if (_declaration.element.attributes.containsKey('lightdom')) {
+        lightFromTemplate(template);
+      } else {
+        root = shadowFromTemplate(template);
+      }
     }
+
+    // Dart note: the following code is to support the getShadowRoot method.
+    if (root is! ShadowRoot) return;
+
+    var name = elementElement.attributes['name'];
+    if (name == null) return;
+    _shadowRoots[name] = root;
   }
 
   /// Return a shadow-root template (if desired), override for custom behavior.
@@ -342,28 +242,17 @@
       elementElement.querySelector('template');
 
   /// Utility function that stamps a `<template>` into light-dom.
-  Node lightFromTemplate(Element template, [Node refNode]) {
+  Node lightFromTemplate(Element template) {
     if (template == null) return null;
-
-    // TODO(sorvell): mark this element as an event controller 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.
-    eventController = this;
-
     // 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 = instanceTemplate(template);
     // append to shadow dom
-    if (refNode != null) {
-      append(dom);
-    } else {
-      insertBefore(dom, refNode);
-    }
-    // perform post-construction initialization tasks on ahem, light root
-    shadowRootReady(this);
+    append(dom);
+    // perform post-construction initialization tasks on shadow root
+    shadowRootReady(this, template);
     // return the created shadow root
     return dom;
   }
@@ -380,8 +269,18 @@
   /// shadowRootReady with a node other than a ShadowRoot such as with `this`.
   ShadowRoot shadowFromTemplate(Element template) {
     if (template == null) return null;
+    // cache elder shadow root (if any)
+    var elderRoot = this.shadowRoot;
     // make a shadow root
     var root = createShadowRoot();
+
+    // Provides ability to traverse from ShadowRoot to the host.
+    // TODO(jmessery): remove once we have this ability on the DOM.
+    _shadowHost[root] = this;
+
+    // migrate flag(s)(
+    root.applyAuthorStyles = applyAuthorStyles;
+    root.resetStyleInheritance = resetStyleInheritance;
     // stamp template
     // which includes parsing and applying MDV bindings before being
     // inserted (to avoid {{}} in attribute values)
@@ -390,19 +289,17 @@
     // append to shadow dom
     root.append(dom);
     // perform post-construction initialization tasks on shadow root
-    shadowRootReady(root);
+    shadowRootReady(root, template);
     // return the created shadow root
     return root;
   }
 
-  void shadowRootReady(Node root) {
+  void shadowRootReady(Node root, Element template) {
     // locate nodes with id and store references to them in this.$ hash
     marshalNodeReferences(root);
-
-    // set up polymer gestures
-    if (_PolymerGestures != null) {
-      _PolymerGestures.callMethod('register', [root]);
-    }
+    // TODO(jmesserly): port this
+    // set up pointer gestures
+    // PointerGestures.register(root);
   }
 
   /// Locate nodes with id and store references to them in [$] hash.
@@ -434,13 +331,13 @@
   }
 
   void copyInstanceAttributes() {
-    _element._instanceAttributes.forEach((name, value) {
+    _declaration._instanceAttributes.forEach((name, value) {
       attributes.putIfAbsent(name, () => value);
     });
   }
 
   void takeAttributes() {
-    if (_element._publishLC == null) return;
+    if (_declaration._publishLC == null) return;
     attributes.forEach(attributeToProperty);
   }
 
@@ -477,7 +374,7 @@
   /// Return the published property matching name, or null.
   // TODO(jmesserly): should we just return Symbol here?
   smoke.Declaration propertyForAttribute(String name) {
-    final publishLC = _element._publishLC;
+    final publishLC = _declaration._publishLC;
     if (publishLC == null) return null;
     //console.log('propertyForAttribute:', name, 'matches', match);
     return publishLC[name];
@@ -498,21 +395,23 @@
     return null;
   }
 
-  void reflectPropertyToAttribute(String path) {
+  void reflectPropertyToAttribute(PropertyPath path) {
+    if (path.length != 1) throw new ArgumentError('path must be length 1');
+
     // TODO(sjmiles): consider memoizing this
     // try to intelligently serialize property value
-    final propValue = new PropertyPath(path).getValueFrom(this);
+    final propValue = path.getValueFrom(this);
     final serializedValue = serializeValue(propValue);
     // boolean properties must reflect as boolean attributes
     if (serializedValue != null) {
-      attributes[path] = serializedValue;
+      attributes['$path'] = 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 (propValue is bool) {
-      attributes.remove(path);
+      attributes.remove('$path');
     }
   }
 
@@ -521,86 +420,95 @@
   ///
   ///     templateBind(template).createInstance(this, polymerSyntax);
   ///
-  /// Where polymerSyntax is a singleton [PolymerExpressions] instance.
+  /// Where polymerSyntax is a singleton `PolymerExpressions` instance from the
+  /// [polymer_expressions](https://pub.dartlang.org/packages/polymer_expressions)
+  /// package.
   ///
   /// You can override this method to change the instantiation behavior of the
   /// template, for example to use a different data-binding syntax.
-  DocumentFragment instanceTemplate(Element template) {
-    var syntax = this.syntax;
-    var t = templateBind(template);
-    if (syntax == null && t.bindingDelegate == null) {
-      syntax = element.syntax;
-    }
-    var dom = t.createInstance(this, syntax);
-    registerObservers(getTemplateInstanceBindings(dom));
-    return dom;
-  }
+  DocumentFragment instanceTemplate(Element template) =>
+      templateBind(template).createInstance(this, syntax);
 
-  Bindable bind(String name, bindable, {bool oneTime: false}) {
+  // TODO(jmesserly): Polymer does not seem to implement the oneTime flag
+  // correctly. File bug.
+  Bindable bind(String name, Bindable bindable, {bool oneTime: false}) {
+    // note: binding is a prepare signal. This allows us to be sure that any
+    // property changes that occur as a result of binding will be observed.
+    if (!_elementPrepared) prepareElement();
+
     var decl = propertyForAttribute(name);
     if (decl == null) {
       // Cannot call super.bind because template_binding is its own package
       return nodeBindFallback(this).bind(name, bindable, oneTime: oneTime);
     } else {
+      // clean out the closets
+      unbind(name);
       // use n-way Polymer binding
-      var observer = bindProperty(decl.name, bindable, oneTime: oneTime);
-      // NOTE: reflecting binding information is typically required only for
-      // tooling. It has a performance cost so it's opt-in in Node.bind.
-      if (enableBindingsReflection && observer != null) {
-         // Dart note: this is not needed because of how _PolymerBinding works.
-         //observer.path = bindable.path_;
-         _recordBinding(name, observer);
-      }
-      var reflect = _element._reflect;
+      var observer = bindProperty(decl.name, bindable);
 
-      // Get back to the (possibly camel-case) name for the property.
-      var propName = smoke.symbolToName(decl.name);
-      if (reflect != null && reflect.contains(propName)) {
-        reflectPropertyToAttribute(propName);
-      }
-      return observer;
+      // reflect bound property to attribute when binding
+      // to ensure binding is not left on attribute if property
+      // does not update due to not changing.
+      // Dart note: we include this patch:
+      // https://github.com/Polymer/polymer/pull/319
+
+      // TODO(jmesserly): polymer has the path_ in their observer object, should
+      // we use that too instead of allocating it here?
+      reflectPropertyToAttribute(new PropertyPath([decl.name]));
+      return bindings[name] = observer;
     }
   }
 
-  _recordBinding(String name, observer) {
-    if (bindings == null) bindings = {};
-    this.bindings[name] = observer;
-  }
-
-  bindFinished() => makeElementReady();
-
   Map<String, Bindable> get bindings => nodeBindFallback(this).bindings;
-  set bindings(Map value) { nodeBindFallback(this).bindings = value; }
-
   TemplateInstance get templateInstance =>
       nodeBindFallback(this).templateInstance;
 
-  // 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.
+  void unbind(String name) => nodeBindFallback(this).unbind(name);
+
   void asyncUnbindAll() {
     if (_unbound == true) return;
-    _unbindLog.fine('[$_name] asyncUnbindAll');
-    _unbindAllJob = scheduleJob(_unbindAllJob, unbindAll);
+    _unbindLog.fine('[$localName] asyncUnbindAll');
+    _unbindAllJob = _runJob(_unbindAllJob, unbindAll, Duration.ZERO);
   }
 
   void unbindAll() {
     if (_unbound == true) return;
-    closeObservers();
-    closeNamedObservers();
+
+    unbindAllProperties();
+    nodeBindFallback(this).unbindAll();
+
+    var root = shadowRoot;
+    while (root != null) {
+      _unbindNodeTree(root);
+      root = root.olderShadowRoot;
+    }
     _unbound = true;
   }
 
-  void cancelUnbindAll() {
+  void cancelUnbindAll({bool preventCascade}) {
     if (_unbound == true) {
-      _unbindLog.warning('[$_name] already unbound, cannot cancel unbindAll');
+      _unbindLog.warning(
+          '[$localName] already unbound, cannot cancel unbindAll');
       return;
     }
-    _unbindLog.fine('[$_name] cancelUnbindAll');
+    _unbindLog.fine('[$localName] cancelUnbindAll');
     if (_unbindAllJob != null) {
       _unbindAllJob.stop();
       _unbindAllJob = null;
     }
+
+    // cancel unbinding our shadow tree iff we're not in the process of
+    // cascading our tree (as we do, for example, when the element is inserted).
+    if (preventCascade == true) return;
+    _forNodeTree(shadowRoot, (n) {
+      if (n is Polymer) {
+        (n as Polymer).cancelUnbindAll();
+      }
+    });
+  }
+
+  static void _unbindNodeTree(Node node) {
+    _forNodeTree(node, (node) => nodeBind(node).unbindAll());
   }
 
   static void _forNodeTree(Node node, void callback(Node node)) {
@@ -613,46 +521,49 @@
   }
 
   /// Set up property observers.
-  void createPropertyObserver() {
-    final observe = _element._observe;
-    if (observe != null) {
+  void observeProperties() {
+    final observe = _declaration._observe;
+    final publish = _declaration._publish;
+
+    // TODO(jmesserly): workaround for a dart2js compiler bug
+    bool hasObserved = observe != null;
+
+    if (hasObserved || publish != null) {
       var o = _propertyObserver = new CompoundObserver();
-      // keep track of property observer so we can shut it down
-      registerObservers([o]);
+      if (hasObserved) {
+        for (var path in observe.keys) {
+          o.addPath(this, path);
 
-      for (var path in observe.keys) {
-        o.addPath(this, path);
-
-        // TODO(jmesserly): on the Polymer side it doesn't look like they
-        // will observe arrays unless it is a length == 1 path.
-        observeArrayValue(path, path.getValueFrom(this), null);
+          // TODO(jmesserly): on the Polymer side it doesn't look like they
+          // will observe arrays unless it is a length == 1 path.
+          observeArrayValue(path, path.getValueFrom(this), null);
+        }
       }
+      if (publish != null) {
+        for (var path in publish.keys) {
+
+          if (!hasObserved || !observe.containsKey(path)) {
+            o.addPath(this, path);
+          }
+        }
+      }
+      o.open(notifyPropertyChanges);
     }
   }
 
-  void openPropertyObserver() {
-    if (_propertyObserver != null) {
-      _propertyObserver.open(notifyPropertyChanges);
-    }
-    // Dart note: we need an extra listener.
-    // see comment on [_propertyChange].
-    if (_element._publish != null) {
-      changes.listen(_propertyChange);
-    }
-  }
 
   /// Responds to property changes on this element.
   void notifyPropertyChanges(List newValues, Map oldValues, List paths) {
-    final observe = _element._observe;
+    final observe = _declaration._observe;
+    final publish = _declaration._publish;
     final called = new HashSet();
 
     oldValues.forEach((i, oldValue) {
-      final newValue = newValues[i];
-
-      // Date note: we don't need any special checking for null and undefined.
-
       // note: paths is of form [object, path, object, path]
-      final path = paths[2 * i + 1];
+      var path = paths[2 * i + 1];
+      if (publish != null && publish.containsKey(path)) {
+        reflectPropertyToAttribute(path);
+      }
       if (observe == null) return;
 
       var methods = observe[path];
@@ -661,46 +572,18 @@
       for (var method in methods) {
         if (!called.add(method)) continue; // don't invoke more than once.
 
+        final newValue = newValues[i];
+        // observes the value if it is an array
         observeArrayValue(path, newValue, oldValue);
         // Dart note: JS passes "arguments", so we pass along our args.
-        // TODO(sorvell): call method with the set of values it's expecting;
-        // e.g. 'foo bar': 'invalidate' expects the new and old values for
-        // foo and bar. Currently we give only one of these and then
-        // deliver all the arguments.
         smoke.invoke(this, method,
             [oldValue, newValue, newValues, oldValues, paths], adjust: true);
       }
     });
   }
 
-  // Dart note: had to rename this to avoid colliding with
-  // Observable.deliverChanges. Even worse, super calls aren't possible or
-  // it prevents Polymer from being a mixin, so we can't override it even if
-  // we wanted to.
-  void deliverPropertyChanges() {
-    if (_propertyObserver != null) {
-      _propertyObserver.deliver();
-    }
-  }
-
-  // Dart note: this is not called by observe-js because we don't have
-  // the mechanism for defining properties on our proto.
-  // TODO(jmesserly): this has similar timing issues as our @published
-  // properties do generally -- it's async when it should be sync.
-  void _propertyChange(List<ChangeRecord> records) {
-    for (var record in records) {
-      if (record is! PropertyChangeRecord) continue;
-
-      final name = smoke.symbolToName(record.name);
-      final reflect = _element._reflect;
-      if (reflect != null && reflect.contains(name)) {
-        reflectPropertyToAttribute(name);
-      }
-    }
-  }
-
   void observeArrayValue(PropertyPath name, Object value, Object old) {
-    final observe = _element._observe;
+    final observe = _declaration._observe;
     if (observe == null) return;
 
     // we only care if there are registered side-effects
@@ -710,62 +593,57 @@
     // if we are observing the previous value, stop
     if (old is ObservableList) {
       if (_observeLog.isLoggable(Level.FINE)) {
-        _observeLog.fine('[$_name] observeArrayValue: unregister $name');
+        _observeLog.fine('[$localName] observeArrayValue: unregister observer '
+            '$name');
       }
 
-      closeNamedObserver('${name}__array');
+      unregisterObserver('${name}__array');
     }
     // if the new value is an array, being observing it
     if (value is ObservableList) {
       if (_observeLog.isLoggable(Level.FINE)) {
-        _observeLog.fine('[$_name] observeArrayValue: register $name');
+        _observeLog.fine('[$localName] observeArrayValue: register observer '
+            '$name');
       }
       var sub = value.listChanges.listen((changes) {
         for (var callback in callbacks) {
           smoke.invoke(this, callback, [old], adjust: true);
         }
       });
-      registerNamedObserver('${name}__array', sub);
+      registerObserver('${name}__array', sub);
     }
   }
 
-  void registerObservers(Iterable<Bindable> observers) {
-    _observers.add(observers);
-  }
+  bool unbindProperty(String name) => unregisterObserver(name);
 
-  void closeObservers() {
-    _observers.forEach(closeObserverList);
-    _observers = [];
-  }
-
-  void closeObserverList(Iterable<Bindable> observers) {
-    for (var o in observers) {
-      if (o != null) o.close();
+  void unbindAllProperties() {
+    if (_propertyObserver != null) {
+      _propertyObserver.close();
+      _propertyObserver = null;
     }
+    unregisterObservers();
   }
 
   /// Bookkeeping observers for memory management.
-  void registerNamedObserver(String name, StreamSubscription sub) {
-    if (_namedObservers == null) {
-      _namedObservers = new Map<String, StreamSubscription>();
+  void registerObserver(String name, StreamSubscription sub) {
+    if (_observers == null) {
+      _observers = new Map<String, StreamSubscription>();
     }
-    _namedObservers[name] = sub;
+    _observers[name] = sub;
   }
 
-  bool closeNamedObserver(String name) {
-    var sub = _namedObservers.remove(name);
+  bool unregisterObserver(String name) {
+    var sub = _observers.remove(name);
     if (sub == null) return false;
     sub.cancel();
     return true;
   }
 
-  void closeNamedObservers() {
-    if (_namedObservers == null) return;
-    for (var sub in _namedObservers.values) {
-      if (sub != null) sub.cancel();
-    }
-    _namedObservers.clear();
-    _namedObservers = null;
+  void unregisterObservers() {
+    if (_observers == null) return;
+    for (var sub in _observers.values) sub.cancel();
+    _observers.clear();
+    _observers = null;
   }
 
   /// Bind the [name] property in this element to [bindable]. *Note* in Dart it
@@ -778,7 +656,7 @@
   ///       bindProperty(#myProperty,
   ///           new PathObserver(this, 'myModel.path.to.otherProp'));
   ///     }
-  Bindable bindProperty(Symbol name, Bindable bindable, {oneTime: false}) {
+  Bindable bindProperty(Symbol name, Bindable bindable) {
     // Dart note: normally we only reach this code when we know it's a
     // property, but if someone uses bindProperty directly they might get a
     // NoSuchMethodError either from the getField below, or from the setField
@@ -786,7 +664,7 @@
     // difference from Polymer.js behavior.
 
     if (_bindLog.isLoggable(Level.FINE)) {
-      _bindLog.fine('bindProperty: [$bindable] to [$_name].[$name]');
+      _bindLog.fine('bindProperty: [$bindable] to [${localName}].[name]');
     }
 
     // capture A's value if B's value is null or undefined,
@@ -797,39 +675,66 @@
       bindable.value = smoke.read(this, name);
     }
 
-    // TODO(jmesserly): we need to fix this -- it doesn't work like Polymer.js
-    // bindings. https://code.google.com/p/dart/issues/detail?id=18343
-    // apply Polymer two-way reference binding
-    //return Observer.bindToInstance(inA, inProperty, observable,
-    //    resolveBindingValue);
+    // TODO(jmesserly): this will create another subscription.
+    // It would be nice to have this reuse our existing _propertyObserver
+    // created by observeProperties, to avoid more observation overhead.
     return new _PolymerBinding(this, name, bindable);
   }
 
   /// Attach event listeners on the host (this) element.
   void addHostListeners() {
-    var events = _element._eventDelegates;
+    var events = _declaration._eventDelegates;
     if (events.isEmpty) return;
 
     if (_eventsLog.isLoggable(Level.FINE)) {
-      _eventsLog.fine('[$_name] addHostListeners: $events');
+      _eventsLog.fine('[$localName] addHostListeners: $events');
+    }
+    addNodeListeners(this, events.keys, hostEventListener);
+  }
+
+  void addNodeListeners(Node node, Iterable<String> events,
+      void listener(Event e)) {
+
+    for (var name in events) {
+      addNodeListener(node, name, listener);
+    }
+  }
+
+  void addNodeListener(Node node, String event, void listener(Event e)) {
+    node.on[event].listen(listener);
+  }
+
+  void hostEventListener(Event event) {
+    // TODO(jmesserly): do we need this check? It was using cancelBubble, see:
+    // https://github.com/Polymer/polymer/issues/292
+    if (!event.bubbles) return;
+
+    bool log = _eventsLog.isLoggable(Level.FINE);
+    if (log) {
+      _eventsLog.fine('>>> [$localName]: hostEventListener(${event.type})');
     }
 
-    // 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.
-    events.forEach((type, methodName) {
-      // Dart note: the getEventHandler method is on our PolymerExpressions.
-      var handler = element.syntax.getEventHandler(this, this, methodName);
-      addEventListener(type, handler);
-    });
+    var h = findEventDelegate(event);
+    if (h != null) {
+      if (log) _eventsLog.fine('[$localName] found host handler name [$h]');
+      var detail = event is CustomEvent ? event.detail : null;
+      // TODO(jmesserly): cache the symbols?
+      dispatchMethod(this, h, [event, detail, this]);
+    }
+
+    if (log) {
+      _eventsLog.fine('<<< [$localName]: hostEventListener(${event.type})');
+    }
   }
 
+  String findEventDelegate(Event event) =>
+      _declaration._eventDelegates[_eventNameFromType(event.type)];
+
   /// Calls [methodOrCallback] with [args] if it is a closure, otherwise, treat
   /// it as a method name in [object], and invoke it.
   void dispatchMethod(object, callbackOrMethod, List args) {
     bool log = _eventsLog.isLoggable(Level.FINE);
-    if (log) _eventsLog.fine('>>> [$_name]: dispatch $callbackOrMethod');
+    if (log) _eventsLog.fine('>>> [$localName]: dispatch $callbackOrMethod');
 
     if (callbackOrMethod is Function) {
       int maxArgs = smoke.maxArgs(callbackOrMethod);
@@ -846,7 +751,31 @@
       _eventsLog.warning('invalid callback');
     }
 
-    if (log) _eventsLog.info('<<< [$_name]: dispatch $callbackOrMethod');
+    if (log) _eventsLog.info('<<< [$localName]: dispatch $callbackOrMethod');
+  }
+
+  /// Bind events via attributes of the form `on-eventName`. This method can be
+  /// use to hooks into the model syntax and adds event listeners as needed. By
+  /// default, binding paths are always method names on the root model, the
+  /// custom element in which the node exists. Adding a '@' in the path directs
+  /// the event binding to use the model path as the event listener.  In both
+  /// cases, the actual listener is attached to a generic method which evaluates
+  /// the bound path at event execution time.
+  // from src/instance/event.js#prepareBinding
+  static PrepareBindingFunction prepareBinding(String path, String name, node) {
+
+    // provide an event-binding callback.
+    return (model, node, oneTime) {
+      if (_eventsLog.isLoggable(Level.FINE)) {
+        _eventsLog.fine('event: [$node].$name => [$model].$path())');
+      }
+      var eventName = _removeEventPrefix(name);
+      // TODO(sigmund): polymer.js dropped event translations. reconcile?
+      var translated = _eventTranslations[eventName];
+      eventName = translated != null ? translated : eventName;
+
+      return new _EventBindable(node, eventName, model, path);
+    };
   }
 
   /// Call [methodName] method on this object with [args].
@@ -859,17 +788,13 @@
   ///
   /// If you would prefer to run the callback using
   /// [window.requestAnimationFrame], see the [async] method.
-  ///
-  /// To cancel, call [Timer.cancel] on the result of this method.
+  // Dart note: "async" is split into 2 methods so it can have a sensible type
+  // signatures. Also removed the various features that don't make sense in a
+  // Dart world, like binding to "this" and taking arguments list.
   Timer asyncTimer(void method(), Duration timeout) {
-    // Dart note: "async" is split into 2 methods so it can have a sensible type
-    // signatures. Also removed the various features that don't make sense in a
-    // Dart world, like binding to "this" and taking arguments list.
-
     // when polyfilling Object.observe, ensure changes
     // propagate before executing the async method
     scheduleMicrotask(Observable.dirtyCheck);
-    _Platform.callMethod('flush'); // for polymer-js interop
     return new Timer(timeout, method);
   }
 
@@ -880,33 +805,24 @@
   ///
   /// If you would prefer to run the callback after a given duration, see
   /// the [asyncTimer] method.
-  ///
-  /// If you would like to cancel this, use [cancelAsync].
   int async(RequestAnimationFrameCallback method) {
     // when polyfilling Object.observe, ensure changes
     // propagate before executing the async method
     scheduleMicrotask(Observable.dirtyCheck);
-    _Platform.callMethod('flush'); // for polymer-js interop
     return window.requestAnimationFrame(method);
   }
 
-  /// Cancel an operation scenduled by [async]. This is just shorthand for:
-  ///     window.cancelAnimationFrame(id);
-  void cancelAsync(int id) => window.cancelAnimationFrame(id);
-
-  /// Fire a [CustomEvent] targeting [onNode], or `this` if onNode is not
-  /// supplied. Returns the new event.
-  CustomEvent fire(String type, {Object detail, Node onNode, bool canBubble,
-        bool cancelable}) {
-    var node = onNode != null ? onNode : this;
-    var event = new CustomEvent(
+  /// Fire a [CustomEvent] targeting [toNode], or this if toNode is not
+  /// supplied. Returns the [detail] object.
+  Object fire(String type, {Object detail, Node toNode, bool canBubble}) {
+    var node = toNode != null ? toNode : this;
+    //log.events && console.log('[%s]: sending [%s]', node.localName, inType);
+    node.dispatchEvent(new CustomEvent(
       type,
       canBubble: canBubble != null ? canBubble : true,
-      cancelable: cancelable != null ? cancelable : true,
       detail: detail
-    );
-    node.dispatchEvent(event);
-    return event;
+    ));
+    return detail;
   }
 
   /// Fire an event asynchronously. See [async] and [fire].
@@ -914,7 +830,7 @@
     // TODO(jmesserly): I'm not sure this method adds much in Dart, it's easy to
     // add "() =>"
     async((x) => fire(
-        type, detail: detail, onNode: toNode, canBubble: canBubble));
+        type, detail: detail, toNode: toNode, canBubble: canBubble));
   }
 
   /// Remove [className] from [old], add class to [anew], if they exist.
@@ -929,93 +845,61 @@
 
   /// Installs external stylesheets and <style> elements with the attribute
   /// polymer-scope='controller' into the scope of element. This is intended
-  /// to be called during custom element construction.
+  /// to be a called during custom element construction. Note, this incurs a
+  /// per instance cost and should be used sparingly.
+  ///
+  /// The need for this type of styling should go away when the shadowDOM spec
+  /// addresses these issues:
+  ///
+  /// https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391
+  /// https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390
+  /// https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389
+  ///
+  /// @param element The custom element instance into whose controller (parent)
+  /// scope styles will be installed.
+  /// @param elementElement The <element> containing controller styles.
+  // TODO(sorvell): remove when spec issues are addressed
   void installControllerStyles() {
-    var scope = findStyleScope();
-    if (scope != null && !scopeHasNamedStyle(scope, localName)) {
+    var scope = findStyleController();
+    if (scope != null && scopeHasElementStyle(scope, _STYLE_CONTROLLER_SCOPE)) {
       // allow inherited controller styles
-      var decl = _element;
+      var decl = _declaration;
       var cssText = new StringBuffer();
       while (decl != null) {
         cssText.write(decl.cssTextForScope(_STYLE_CONTROLLER_SCOPE));
         decl = decl.superDeclaration;
       }
-      if (cssText.isNotEmpty) {
-        installScopeCssText('$cssText', scope);
+      if (cssText.length > 0) {
+        var style = decl.cssTextToScopeStyle(cssText.toString(),
+              _STYLE_CONTROLLER_SCOPE);
+        // TODO(sorvell): for now these styles are not shimmed
+        // but we may need to shim them
+        Polymer.applyStyleToScope(style, scope);
       }
     }
   }
 
-  void installScopeStyle(style, [String name, Node scope]) {
-    if (scope == null) scope = findStyleScope();
-    if (name == null) name = '';
-
-    if (scope != null && !scopeHasNamedStyle(scope, '$_name$name')) {
-      var cssText = new StringBuffer();
-      if (style is Iterable) {
-        for (var s in style) {
-          cssText..writeln(s.text)..writeln();
-        }
-      } else {
-        cssText = (style as Node).text;
+  Node findStyleController() {
+    if (js.context.hasProperty('ShadowDOMPolyfill')) {
+      return document.querySelector('head'); // get wrapped <head>.
+    } else {
+      // find the shadow root that contains this element
+      var n = this;
+      while (n.parentNode != null) {
+        n = n.parentNode;
       }
-      installScopeCssText('$cssText', scope, name);
+      return identical(n, document) ? document.head : n;
     }
   }
 
-  void installScopeCssText(String cssText, [Node scope, String name]) {
-    if (scope == null) scope = findStyleScope();
-    if (name == null) name = '';
-
-    if (scope == null) return;
-
-    if (_ShadowCss != null) {
-      cssText = _shimCssText(cssText, scope is ShadowRoot ? scope.host : null);
-    }
-    var style = element.cssTextToScopeStyle(cssText,
-        _STYLE_CONTROLLER_SCOPE);
-    applyStyleToScope(style, scope);
-    // cache that this style has been applied
-    Set styles = _scopeStyles[scope];
-    if (styles == null) _scopeStyles[scope] = styles = new Set();
-    styles.add('$_name$name');
-  }
-
-  Node findStyleScope([node]) {
-    // find the shadow root that contains this element
-    var n = node;
-    if (n == null) n = this;
-    while (n.parentNode != null) {
-      n = n.parentNode;
-    }
-    return n;
-  }
-
-  bool scopeHasNamedStyle(Node scope, String name) {
-    Set styles = _scopeStyles[scope];
-    return styles != null && styles.contains(name);
-  }
-
-  static final _scopeStyles = new Expando();
-
-  static String _shimCssText(String cssText, [Element host]) {
-    var name = '';
-    var is_ = false;
-    if (host != null) {
-      name = host.localName;
-      is_ = host.attributes.containsKey('is');
-    }
-    var selector = _ShadowCss.callMethod('makeScopeSelector', [name, is_]);
-    return _ShadowCss.callMethod('shimCssText', [cssText, selector]);
+  bool scopeHasElementStyle(scope, descriptor) {
+    var rule = '$_STYLE_SCOPE_ATTRIBUTE=$localName-$descriptor';
+    return scope.querySelector('style[$rule]') != null;
   }
 
   static void applyStyleToScope(StyleElement style, Node scope) {
     if (style == null) return;
 
-    if (scope == document) scope = document.head;
-
-    if (_hasShadowDomPolyfill) 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
@@ -1028,33 +912,7 @@
       clone.attributes[_STYLE_SCOPE_ATTRIBUTE] = attr;
     }
 
-    // TODO(sorvell): probably too brittle; try to figure out
-    // where to put the element.
-    var refNode = scope.firstChild;
-    if (scope == document.head) {
-      var selector = 'style[$_STYLE_SCOPE_ATTRIBUTE]';
-      var styleElement = document.head.querySelectorAll(selector);
-      if (styleElement.isNotEmpty) {
-        refNode = styleElement.last.nextElementSibling;
-      }
-    }
-    scope.insertBefore(clone, refNode);
-  }
-
-  /// Invoke [callback] in [wait], unless the job is re-registered,
-  /// which resets the timer. If [wait] is not supplied, this will use
-  /// [window.requestAnimationFrame] instead of a [Timer].
-  ///
-  /// For example:
-  ///
-  ///     _myJob = Polymer.scheduleJob(_myJob, callback);
-  ///
-  /// Returns the newly created job.
-  // Dart note: renamed to scheduleJob to be a bit more consistent with Dart.
-  PolymerJob scheduleJob(PolymerJob job, void callback(), [Duration wait]) {
-    if (job == null) job = new PolymerJob._();
-    // Dart note: made start smarter, so we don't need to call stop.
-    return job..start(callback, wait);
+    scope.append(clone);
   }
 }
 
@@ -1113,7 +971,80 @@
 final Logger _unbindLog = new Logger('polymer.unbind');
 final Logger _bindLog = new Logger('polymer.bind');
 
+final Expando _shadowHost = new Expando<Polymer>();
+
 final Expando _eventHandledTable = new Expando<Set<Node>>();
 
-final JsObject _PolymerGestures = js.context['PolymerGestures'];
+/// Base class for PolymerElements deriving from HtmlElement.
+///
+/// See [Polymer].
+class PolymerElement extends HtmlElement with Polymer, Observable {
+  PolymerElement.created() : super.created() {
+    polymerCreated();
+  }
+}
 
+class _PropertyValue {
+  Object oldValue, newValue;
+  _PropertyValue(this.oldValue);
+}
+
+class PolymerExpressionsWithEvents extends PolymerExpressions {
+  PolymerExpressionsWithEvents({Map<String, Object> globals})
+      : super(globals: globals);
+
+  prepareBinding(String path, name, node) {
+    if (_hasEventPrefix(name)) return Polymer.prepareBinding(path, name, node);
+    return super.prepareBinding(path, name, node);
+  }
+}
+
+class _EventBindable extends Bindable {
+  final Node _node;
+  final String _eventName;
+  final _model;
+  final String _path;
+  StreamSubscription _sub;
+
+  _EventBindable(this._node, this._eventName, this._model, this._path);
+
+  _listener(event) {
+    var ctrlr = _findController(_node);
+    if (ctrlr is! Polymer) return;
+    var obj = ctrlr;
+    var method = _path;
+    if (_path.startsWith('@')) {
+      obj = _model;
+      method = new PropertyPath(_path.substring(1)).getValueFrom(_model);
+    }
+    var detail = event is CustomEvent ?
+        (event as CustomEvent).detail : null;
+    ctrlr.dispatchMethod(obj, method, [event, detail, _node]);
+  }
+
+  // TODO(jmesserly): this won't find the correct host unless the ShadowRoot
+  // was created on a PolymerElement.
+  static Polymer _findController(Node node) {
+    while (node.parentNode != null) {
+      node = node.parentNode;
+    }
+    return _shadowHost[node];
+  }
+
+  get value => null;
+
+  open(callback) {
+    _sub = _node.on[_eventName].listen(_listener);
+  }
+
+  close() {
+    if (_sub != null) {
+      if (_eventsLog.isLoggable(Level.FINE)) {
+        _eventsLog.fine(
+            'event.remove: [$_node].$_eventName => [$_model].$_path())');
+      }
+     _sub.cancel();
+      _sub = null;
+    }
+  }
+}
diff --git a/pkg/polymer/lib/src/job.dart b/pkg/polymer/lib/src/job.dart
index aa22f47..e92d0c8 100644
--- a/pkg/polymer/lib/src/job.dart
+++ b/pkg/polymer/lib/src/job.dart
@@ -4,45 +4,43 @@
 
 part of polymer;
 
-/// Like [Timer] but can be restarted, and if no duration is supplied uses
-/// [window.requestAnimationFrame] instead of a 0-duration timer.
-// TODO(jmesserly): need to find a better name here. Also this feels more like a
-// system level API, but doesn't map exactly to any of our other primitives.
-class PolymerJob {
+/// Invoke [callback] in [wait], unless the job is re-registered,
+/// which resets the timer. For example:
+///
+///     _myJob = runJob(_myJob, callback, const Duration(milliseconds: 100));
+///
+/// Returns a job handle which can be used to re-register a job.
+// Dart note: renamed to runJob to avoid conflict with instance member "job".
+_Job _runJob(_Job job, void callback(), Duration wait) {
+  if (job != null) {
+    job.stop();
+  } else {
+    job = new _Job();
+  }
+  job.go(callback, wait);
+  return job;
+}
+
+// Public in Polymer.js but private as not sure it's the correct API for Dart.
+// Switch to Timer when 14414 is addressed.
+class _Job {
   Function _callback;
   Timer _timer;
-  int _id; // for requestAnimationFrame
 
-  PolymerJob._();
-
-  bool get isScheduled => _timer != null || _id != null;
-
-  /// Starts the job. If the job is already running, it will [stop] first.
-  void start(void callback(), [Duration wait]) {
-    stop();
-    _callback = callback;
-    if (wait == null) {
-      _id = window.requestAnimationFrame((_) => complete());
-    } else {
-      _timer = new Timer(wait, complete);
-    }
+  void go(void callback(), Duration wait) {
+    this._callback = callback;
+    _timer = new Timer(wait, complete);
   }
 
-  /// Stops the job. It can be restarted by calling [start] with a new callback.
   void stop() {
-    if (_id != null) {
-      window.cancelAnimationFrame(_id);
-      _id = null;
-    }
     if (_timer != null) {
       _timer.cancel();
       _timer = null;
     }
   }
 
-  /// Synchronously completes the job.
   void complete() {
-    if (isScheduled) {
+    if (_timer != null) {
       stop();
       _callback();
     }
diff --git a/pkg/polymer/lib/src/js/polymer/build.log b/pkg/polymer/lib/src/js/polymer/build.log
index e729eb1..2daeb00 100644
--- a/pkg/polymer/lib/src/js/polymer/build.log
+++ b/pkg/polymer/lib/src/js/polymer/build.log
@@ -1,33 +1,32 @@
 BUILD LOG
 ---------
-Build Time: 2014-05-23T14:36:17
+Build Time: 2014-04-01T15:27:00
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.24
+nodejs: v0.10.26
 chai: 1.9.1
-grunt: 0.4.5
-grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.1
+grunt: 0.4.4
+grunt-audit: 0.0.3
 grunt-contrib-concat: 0.4.0
 grunt-contrib-uglify: 0.4.0
 grunt-contrib-yuidoc: 0.5.2
-grunt-karma: 0.8.3
-karma: 0.12.16
-karma-crbot-reporter: 0.0.4
+grunt-karma: 0.8.2
+karma: 0.12.2
 karma-firefox-launcher: 0.1.3
-karma-ie-launcher: 0.1.5
+karma-crbot-reporter: 0.0.4
 karma-mocha: 0.1.3
+karma-ie-launcher: 0.1.4
 karma-safari-launcher: 0.1.1
 karma-script-launcher: 0.1.0
-mocha: 1.19.0
+mocha: 1.18.2
+Polymer: 0.2.2
 
 REPO REVISIONS
 ==============
-polymer-expressions: b21c350b298b5dfc645350aaa0fd4d65c3cc061d
-polymer-gestures: b2949ff40fd6647e3a101cbad8e0ef716961365b
-polymer-dev: 5d175407c142f1eff6e1300242370975a940a282
+polymer-dev: 40bde06093289de27439809e0c5ea34b9be14b66
 
 BUILD HASHES
 ============
-build/polymer.js: 7c30f9285eb23a3cce2c20339f510797585a723d
\ No newline at end of file
+build/polymer.js: 13d61f33186d09afa35cdf77fcfedb742f8a2880
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer-body.html b/pkg/polymer/lib/src/js/polymer/polymer-body.html
new file mode 100644
index 0000000..5f07a01
--- /dev/null
+++ b/pkg/polymer/lib/src/js/polymer/polymer-body.html
@@ -0,0 +1,33 @@
+<polymer-element name="polymer-body" extends="body">
+
+  <script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+    
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+  </script>
+
+</polymer-element>
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 2478c92..85a6554 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -1,3549 +1,14 @@
-/**
- * @license
- * 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
+/*
+ * 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.PolymerGestures = {};
+Polymer = {};
 
 /*
- * 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(scope) {
-  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) {
-      if (!element) {
-        return document;
-      }
-      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);
-    },
-    LCA: function(a, b) {
-      if (a === b) {
-        return a;
-      }
-      if (a && !b) {
-        return a;
-      }
-      if (b && !a) {
-        return b;
-      }
-      if (!b && !a) {
-        return document;
-      }
-      // fast case, a is a direct descendant of b or vice versa
-      if (a.contains && a.contains(b)) {
-        return a;
-      }
-      if (b.contains && 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; n && (i < u); i++) {
-        n = n.parentNode || n.host;
-      }
-      return n;
-    },
-    depth: function(n) {
-      var d = 0;
-      while(n) {
-        d++;
-        n = n.parentNode || n.host;
-      }
-      return d;
-    },
-    deepContains: function(a, b) {
-      var common = this.LCA(a, b);
-      // if a is the common ancestor, it must "deeply" contain b
-      return common === a;
-    },
-    insideNode: function(node, x, y) {
-      var rect = node.getBoundingClientRect();
-      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);
-    }
-  };
-  scope.targetFinding = target;
-  /**
-   * Given an event, finds the "deepest" node that could have been the original target before ShadowDOM retargetting
-   *
-   * @param {Event} Event An event object with clientX and clientY properties
-   * @return {Element} The probable event origninator
-   */
-  scope.findTarget = target.findTarget.bind(target);
-  /**
-   * Determines if the "container" node deeply contains the "containee" node, including situations where the "containee" is contained by one or more ShadowDOM
-   * roots.
-   *
-   * @param {Node} container
-   * @param {Node} containee
-   * @return {Boolean}
-   */
-  scope.deepContains = target.deepContains.bind(target);
-
-  /**
-   * Determines if the x/y position is inside the given node.
-   *
-   * Example:
-   *
-   *     function upHandler(event) {
-   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);
-   *       if (innode) {
-   *         // wait for tap?
-   *       } else {
-   *         // tap will never happen
-   *       }
-   *     }
-   *
-   * @param {Node} node
-   * @param {Number} x Screen X position
-   * @param {Number} y screen Y position
-   * @return {Boolean}
-   */
-  scope.insideNode = target.insideNode;
-
-})(window.PolymerGestures);
-
-/*
- *
- * 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() {
-  function shadowSelector(v) {
-    return 'body /deep/ ' + selector(v);
-  }
-  function selector(v) {
-    return '[touch-action="' + v + '"]';
-  }
-  function rule(v) {
-    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}';
-  }
-  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 hasTouchAction = typeof document.head.style.touchAction === 'string';
-  // only add shadow selectors if shadowdom is supported
-  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
-
-  if (hasTouchAction) {
-    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 (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
- */
-
-/**
- * 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
-  ];
-
-  var NOP_FACTORY = function(){ return function(){}; };
-
-  var eventFactory = {
-    // TODO(dfreedm): this is overridden by tap recognizer, needs review
-    preventTap: NOP_FACTORY,
-    makeBaseEvent: function(inType, inDict) {
-      var e = document.createEvent('Event');
-      e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
-      e.preventTap = eventFactory.preventTap(e);
-      return e;
-    },
-    makeGestureEvent: function(inType, inDict) {
-      inDict = inDict || Object.create(null);
-
-      var e = this.makeBaseEvent(inType, inDict);
-      for (var i = 0, keys = Object.keys(inDict), k; i < keys.length; i++) {
-        k = keys[i];
-        e[k] = inDict[k];
-      }
-      return e;
-    },
-    makePointerEvent: function(inType, inDict) {
-      inDict = inDict || Object.create(null);
-
-      var e = this.makeBaseEvent(inType, inDict);
-      // 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;
-    }
-  };
-
-  scope.eventFactory = eventFactory;
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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.PolymerGestures);
-
-/*
- * 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(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',
-    'timeStamp',
-    // gesture addons
-    'preventTap',
-    '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,
-    function(){},
-    false
-  ];
-
-  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
-
-  var wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };
-
-  var eventFactory = scope.eventFactory;
-  /**
-   * 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),
-    // Scope objects for native events.
-    // This exists for ease of testing.
-    eventSources: Object.create(null),
-    eventSourceList: [],
-    gestures: [],
-    gestureQueue: [],
-    /**
-     * 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);
-      }
-    },
-    registerGesture: function(name, source) {
-      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
-        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);
-      }
-    },
-    // EVENTS
-    down: function(inEvent) {
-      this.fireEvent('down', inEvent);
-    },
-    move: function(inEvent) {
-      // pipe move events into gesture queue directly
-      inEvent.type = 'move';
-      this.fillGestureQueue(inEvent);
-    },
-    up: function(inEvent) {
-      this.fireEvent('up', inEvent);
-    },
-    cancel: function(inEvent) {
-      inEvent.tapPrevented = true;
-      this.fireEvent('up', inEvent);
-    },
-    // LISTENER LOGIC
-    eventHandler: function(inEvent) {
-      // This is used to prevent multiple dispatch of events 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._handledByPG) {
-        return;
-      }
-      var type = inEvent.type;
-      var fn = this.eventMap && this.eventMap[type];
-      if (fn) {
-        fn(inEvent);
-      }
-      inEvent._handledByPG = 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: function(target, eventName) {
-      // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
-        target.addEventListener_(eventName, this.boundHandler);
-      } else {
-        target.addEventListener(eventName, this.boundHandler);
-      }
-    },
-    removeEvent: function(target, eventName) {
-      // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
-        target.removeEventListener_(eventName, this.boundHandler);
-      } else {
-        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) {
-      var e = eventFactory.makePointerEvent(inType, inEvent);
-      e.preventDefault = inEvent.preventDefault;
-      e.tapPrevented = inEvent.tapPrevented;
-      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 (p === 'target' || p === 'relatedTarget') {
-          if (HAS_SVG_INSTANCE && eventCopy[p] instanceof SVGElementInstance) {
-            eventCopy[p] = eventCopy[p].correspondingUseElement;
-          }
-          eventCopy[p] = wrap(eventCopy[p]);
-        }
-      }
-      // keep the semantics of preventDefault
-      eventCopy.preventDefault = inEvent.preventDefault;
-      return eventCopy;
-    },
-    /**
-     * 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: function(inEvent) {
-      var t = inEvent._target;
-      if (t) {
-        t.dispatchEvent(inEvent);
-        // clone the event for the gesture system to process
-        // clone after dispatch to pick up gesture prevention code
-        var clone = this.cloneEvent(inEvent);
-        clone.target = t;
-        this.fillGestureQueue(clone);
-      }
-    },
-    gestureTrigger: function() {
-      // 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++) {
-          g = this.gestures[j];
-          if (g.events.indexOf(e.type) >= 0) {
-            g[e.type].call(g, e);
-          }
-        }
-      }
-      this.gestureQueue.length = 0;
-    },
-    fillGestureQueue: function(ev) {
-      // only trigger the gesture queue once
-      if (!this.gestureQueue.length) {
-        requestAnimationFrame(this.boundGestureTrigger);
-      }
-      this.gestureQueue.push(ev);
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
-  scope.dispatcher = dispatcher;
-  scope.register = dispatcher.register.bind(dispatcher);
-  scope.unregister = dispatcher.unregister.bind(dispatcher);
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');
-    };
-  }
-
-  scope.Installer = Installer;
-})(window.PolymerGestures);
-
-/*
- * 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 (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',
-    ],
-    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);
-      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.mouseup(inEvent);
-        }
-        var e = this.prepareEvent(inEvent);
-        pointermap.set(this.POINTER_ID, e.target);
-        dispatcher.down(e);
-      }
-    },
-    mousemove: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        e.target = pointermap.get(this.POINTER_ID);
-        dispatcher.move(e);
-      }
-    },
-    mouseup: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        e.relatedTarget = e.target;
-        e.target = pointermap.get(this.POINTER_ID);
-        dispatcher.up(e);
-        this.cleanupMouse();
-      }
-    },
-    cleanupMouse: function() {
-      pointermap['delete'](this.POINTER_ID);
-    }
-  };
-
-  scope.mouseEvents = mouseEvents;
-})(window.PolymerGestures);
-
-/*
- * 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(scope) {
-  var dispatcher = scope.dispatcher;
-  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;
-  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';
-
-  // handler block for native touch events
-  var touchEvents = {
-    events: [
-      'touchstart',
-      'touchmove',
-      'touchend',
-      'touchcancel'
-    ],
-    register: function(target) {
-      if (HAS_TOUCH_ACTION) {
-        dispatcher.listen(target, this.events);
-      } else {
-        INSTALLER.enableOnSubtree(target);
-      }
-    },
-    unregister: function(target) {
-      if (HAS_TOUCH_ACTION) {
-        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;
-    },
-    findTarget: function(touch, id) {
-      if (this.currentTouchEvent.type === 'touchstart') {
-        return scope.findTarget(touch);
-      }
-      // reuse target we found in touchstart
-      return pointermap.get(id);
-    },
-    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 = this.findTarget(inTouch, id);
-      e.bubbles = true;
-      e.cancelable = true;
-      e.detail = this.clickCount;
-      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.down);
-      }
-    },
-    down: function(inPointer) {
-      var p = pointermap.set(inPointer.pointerId, inPointer.target);
-      dispatcher.down(inPointer);
-    },
-    touchmove: function(inEvent) {
-      if (HAS_TOUCH_ACTION) {
-        this.processTouches(inEvent, this.move);
-      } else {
-        if (!this.scrolling) {
-          if (this.shouldScroll(inEvent)) {
-            this.scrolling = true;
-            this.touchcancel(inEvent);
-          } else {
-            inEvent.preventDefault();
-            this.processTouches(inEvent, this.move);
-          }
-        }
-      }
-    },
-    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) {
-      this.dedupSynthMouse(inEvent);
-      this.processTouches(inEvent, this.up);
-    },
-    up: function(inPointer) {
-      if (!this.scrolling) {
-        inPointer.relatedTarget = scope.findTarget(inPointer);
-        dispatcher.up(inPointer);
-      }
-      this.cleanUpPointer(inPointer);
-    },
-    cancel: function(inPointer) {
-      inPointer.relatedTarget = scope.findTarget(inPointer);
-      dispatcher.cancel(inPointer);
-      this.cleanUpPointer(inPointer);
-    },
-    touchcancel: function(inEvent) {
-      this.processTouches(inEvent, this.cancel);
-    },
-    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) {
-    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
-  }
-
-  scope.touchEvents = touchEvents;
-})(window.PolymerGestures);
-
-/*
- * 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(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',
-      'MSPointerCancel',
-    ],
-    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) {
-      var e = this.prepareEvent(inEvent);
-      pointermap.set(inEvent.pointerId, e.target);
-      dispatcher.down(e);
-    },
-    MSPointerMove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.move(e);
-    },
-    MSPointerUp: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
-      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.target = pointermap.get(e.pointerId);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    }
-  };
-
-  scope.msEvents = msEvents;
-})(window.PolymerGestures);
-
-/*
- * 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(scope) {
-  var dispatcher = scope.dispatcher;
-  var pointermap = dispatcher.pointermap;
-  var pointerEvents = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    prepareEvent: function(inEvent) {
-      return dispatcher.cloneEvent(inEvent);
-    },
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      dispatcher.unlisten(target, this.events);
-    },
-    cleanup: function(id) {
-      pointermap['delete'](id);
-    },
-    pointerdown: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      pointermap.set(e.pointerId, e.target);
-      dispatcher.down(e);
-    },
-    pointermove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.target = pointermap.get(e.pointerId);
-      dispatcher.move(e);
-    },
-    pointerup: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
-      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.target = pointermap.get(e.pointerId);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    }
-  };
-
-  scope.pointerEvents = pointerEvents;
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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;
-
-  if (window.PointerEvent) {
-    dispatcher.registerSource('pointer', scope.pointerEvents);
-  } else if (window.navigator.msPointerEnabled) {
-    dispatcher.registerSource('ms', scope.msEvents);
-  } else {
-    dispatcher.registerSource('mouse', scope.mouseEvents);
-    if (window.ontouchstart !== undefined) {
-      dispatcher.registerSource('touch', scope.touchEvents);
-    }
-  }
-
-  dispatcher.register(document);
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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 eventFactory = scope.eventFactory;
-   var pointermap = new scope.PointerMap();
-   var track = {
-     events: [
-       'down',
-       'move',
-       'up',
-     ],
-     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 e = eventFactory.makeGestureEvent(inType, {
-         bubbles: true,
-         cancelable: true,
-         dx: d.x,
-         dy: d.y,
-         ddx: dd.x,
-         ddy: dd.y,
-         x: inEvent.x,
-         y: inEvent.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.relatedTarget,
-         pointerType: inEvent.pointerType,
-         pointerId: inEvent.pointerId
-       });
-       t.downTarget.dispatchEvent(e);
-     },
-     down: 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);
-       }
-     },
-     move: 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);
-         }
-         p.lastMoveEvent = inEvent;
-       }
-     },
-     up: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (p.tracking) {
-           this.fireTrack('trackend', inEvent, p);
-         }
-         pointermap.delete(inEvent.pointerId);
-       }
-     }
-   };
-   dispatcher.registerGesture('track', track);
- })(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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 eventFactory = scope.eventFactory;
-  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: [
-      'down',
-      'move',
-      'up',
-    ],
-    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;
-    },
-    down: function(inEvent) {
-      if (inEvent.isPrimary && !this.heldPointer) {
-        this.heldPointer = inEvent;
-        this.target = inEvent.target;
-        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
-      }
-    },
-    up: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        this.cancel();
-      }
-    },
-    move: 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 = {
-        bubbles: true,
-        cancelable: true,
-        pointerType: this.heldPointer.pointerType,
-        pointerId: this.heldPointer.pointerId,
-        x: this.heldPointer.clientX,
-        y: this.heldPointer.clientY
-      };
-      if (inHoldTime) {
-        p.holdTime = inHoldTime;
-      }
-      var e = eventFactory.makeGestureEvent(inType, p);
-      this.target.dispatchEvent(e);
-    }
-  };
-  dispatcher.registerGesture('hold', hold);
-})(window.PolymerGestures);
-
-/*
- * 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
- */
-
-/**
- * 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 eventFactory = scope.eventFactory;
-  var pointermap = new scope.PointerMap();
-  var tap = {
-    events: [
-      'down',
-      'up'
-    ],
-    down: function(inEvent) {
-      if (inEvent.isPrimary && !inEvent.tapPrevented) {
-        pointermap.set(inEvent.pointerId, {
-          target: inEvent.target,
-          buttons: inEvent.buttons,
-          x: inEvent.clientX,
-          y: inEvent.clientY
-        });
-      }
-    },
-    shouldTap: function(e, downState) {
-      if (e.pointerType === 'mouse') {
-        // only allow left click to tap for mouse
-        return downState.buttons === 1;
-      }
-      return !e.tapPrevented;
-    },
-    up: function(inEvent) {
-      var start = pointermap.get(inEvent.pointerId);
-      if (start && this.shouldTap(inEvent, start)) {
-        // up.relatedTarget is target currently under finger
-        var t = scope.targetFinding.LCA(start.target, inEvent.relatedTarget);
-        if (t) {
-          var e = eventFactory.makeGestureEvent('tap', {
-            bubbles: true,
-            cancelable: true,
-            x: inEvent.clientX,
-            y: inEvent.clientY,
-            detail: inEvent.detail,
-            pointerType: inEvent.pointerType,
-            pointerId: inEvent.pointerId,
-            altKey: inEvent.altKey,
-            ctrlKey: inEvent.ctrlKey,
-            metaKey: inEvent.metaKey,
-            shiftKey: inEvent.shiftKey
-          });
-          t.dispatchEvent(e);
-        }
-      }
-      pointermap.delete(inEvent.pointerId);
-    }
-  };
-  // patch eventFactory to remove id from tap's pointermap for preventTap calls
-  eventFactory.preventTap = function(e) {
-    return function() {
-      e.tapPrevented = true;
-      pointermap.delete(e.pointerId);
-    };
-  };
-  dispatcher.registerGesture('tap', tap);
-})(window.PolymerGestures);
-
-/*
-  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';
-
-  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) {
-    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.simplePath =
-        !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();
-    });
-  }
-
-  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 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 (!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;
-
-})(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
- */
-Polymer = {
-  version: '0.3.1-604ba08'
-};
-
-/*
- * 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
+ * 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
@@ -3555,14 +20,10 @@
 
 
 /*
- * 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
+ * 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'
@@ -3592,13 +53,10 @@
 
 })(Polymer);
 
-/*
- * 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
+/* 
+ * 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) {
@@ -3663,14 +121,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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 = {};
@@ -3701,147 +155,133 @@
   */
 })(Polymer);
 
-/*

- * 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(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')

-        // invariant: because we cache _super on fn below, we never reach 

-        // here from inside a series of calls to super(), so it's ok to 

-        // start searching from the prototype of 'this' (at the 'top')

-        // we must never memoize a null super for this reason

-        _super = memoizeSuper(caller, nom, getPrototypeOf(this));

-      }

-      // our super function

-      var fn = _super[nom];

-      if (fn) {

-        // memoize information so 'fn' can call 'super'

-        if (!fn._super) {

-          // must not memoize null, or we lose our invariant above

-          memoizeSuper(fn, nom, _super);

-        }

-        // invoke the inherited method

-        // if 'fn' is not function valued, this will throw

-        return fn.apply(this, arrayOfArgs || []);

-      }

-    }

-

-    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__;

-      }

-    }

-

-    function memoizeSuper(method, name, proto) {

-      // find and cache next prototype containing `name`

-      // we need the prototype so we can do another lookup

-      // from here

-      var s = nextSuper(proto, name, method);

-      if (s[name]) {

-        // `s` is a prototype, the actual method is `s[name]`

-        // tag super method with it's name for quicker lookups

-        s[name].nom = name;

-      }

-      return method._super = s;

-    }

-

-    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);

-      }

-      // must not return null, or we lose our invariant above

-      // in this case, a super() call was invoked where no superclass

-      // method exists

-      // TODO(sjmiles): thow an exception?

-      return Object;

-    }

-

-    // 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 (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
+ * 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) {
@@ -3908,12 +348,9 @@
 })(Polymer);
 
 /*
- * 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
+ * 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) {
 
@@ -3932,7 +369,7 @@
     for (var n in apis) {
       extend(prototype, apis[n]);
     }
-  };
+  }
 
   // exports
 
@@ -3941,14 +378,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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 = {
@@ -4048,12 +481,9 @@
 })(Polymer);
 
 /*
- * 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
+ * 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) {
@@ -4075,10 +505,24 @@
       // (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.
-      for (var type in events) {
-        var methodName = events[type];
-        this.addEventListener(type, this.element.getEventHandler(this, this,
-                                                                 methodName));
+      // 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
@@ -4102,14 +546,10 @@
 })(Polymer);
 
 /*

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

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

@@ -4200,14 +640,10 @@
 })(Polymer);

 
 /*
- * 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
+ * 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
@@ -4223,24 +659,27 @@
   var empty = [];
 
   var properties = {
-    createPropertyObserver: function() {
-      var n$ = this._observeNames;
-      if (n$ && n$.length) {
-        var o = this._propertyObserver = new CompoundObserver(true);
+    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]);
-        // 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 
-        // a value property
         for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
           o.addPath(this, n);
-          this.observeArrayValue(n, this[n], null);
+          // observer array properties
+          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
+          if (pd && pd.value) {
+            this.observeArrayValue(n, pd.value, null);
+          }
         }
-      }
-    },
-    openPropertyObserver: function() {
-      if (this._propertyObserver) {
-        this._propertyObserver.open(this.notifyPropertyChanges, this);
+        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) {
@@ -4248,35 +687,20 @@
       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) {
-          var ov = oldValues[i], nv = newValues[i];
-          // observes the value if it is an array
-          this.observeArrayValue(name, nv, ov);
+          this.observeArrayValue(name, newValues[i], oldValues[i]);
           if (!called[method]) {
-            // only invoke change method if one of ov or nv is not (undefined | null)
-            if ((ov !== undefined && ov !== null) || (nv !== undefined && nv !== null)) {
-              called[method] = true;
-              // TODO(sorvell): call method with the set of values it's expecting;
-              // e.g. 'foo bar': 'invalidate' expects the new and old values for
-              // foo and bar. Currently we give only one of these and then
-              // deliver all the arguments.
-              this.invokeMethod(method, [ov, nv, arguments]);
-            }
+            called[method] = true;
+            // observes the value if it is an array
+            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
           }
         }
       }
     },
-    deliverChanges: function() {
-      if (this._propertyObserver) {
-        this._propertyObserver.deliver();
-      }
-    },
-    propertyChanged_: function(name, value, oldValue) {
-      if (this.reflect[name]) {
-        this.reflectPropertyToAttribute(name);
-      }
-    },
     observeArrayValue: function(name, value, old) {
       // we only care if there are registered side-effects
       var callbackName = this.observe[name];
@@ -4297,11 +721,8 @@
         }
       }
     },
-    bindProperty: function(property, observable, oneTime) {
-      if (oneTime) {
-        this[property] = observable;
-        return;
-      }
+    bindProperty: function(property, observable) {
+      // apply Polymer two-way reference binding
       return bindProperties(this, property, observable);
     },
     invokeMethod: function(method, args) {
@@ -4311,14 +732,10 @@
       }
     },
     registerObservers: function(observers) {
-      this._observers = this._observers || [];
       this._observers.push(observers);
     },
     // 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]);
       }
@@ -4347,8 +764,10 @@
     },
     closeNamedObservers: function() {
       if (this._namedObservers) {
-        for (var i in this._namedObservers) {
-          this.closeNamedObserver(i);
+        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 = {};
       }
@@ -4358,24 +777,23 @@
   // 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;
+  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 (value === null || value === undefined) ? oldValue : value;
+    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
 
@@ -4384,27 +802,47 @@
 })(Polymer);
 
 /*
- * 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
+ * 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) {
-      // ensure a default bindingDelegate
-      var syntax = this.syntax || (!template.bindingDelegate &&
-          this.element.syntax);
-      var dom = template.createInstance(this, syntax);
+      var dom = template.createInstance(this, this.syntax);
       this.registerObservers(dom.bindings_);
       return dom;
     },
@@ -4416,26 +854,18 @@
         return this.mixinSuper(arguments);
       } else {
         // use n-way Polymer binding
-        var observer = this.bindProperty(property, observable, oneTime);
+        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) {
+        if (Platform.enableBindingsReflection) {
           observer.path = observable.path_;
-          this._recordBinding(property, observer);
-        }
-        if (this.reflect[property]) {
-          this.reflectPropertyToAttribute(property);
+          this.bindings_ = this.bindings_ || {};
+          this.bindings_[name] = observer;
         }
         return observer;
       }
     },
-    bindFinished: function() {
-      this.makeElementReady();
-    },
-    _recordBinding: function(name, observer) {
-      this.bindings_ = this.bindings_ || {};
-      this.bindings_[name] = 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.
@@ -4491,14 +921,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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 = {
@@ -4527,39 +953,22 @@
       }
       this.created();
       this.prepareElement();
-      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected
-      // https://github.com/Polymer/ShadowDOM/issues/420
-      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {
-        this.makeElementReady();
-      }
     },
     // system entry point, do not override
     prepareElement: function() {
-      if (this._elementPrepared) {
-        console.warn('Element already prepared', this.localName);
-        return;
-      }
       this._elementPrepared = true;
-      // storage for shadowRoots info
+      // install shadowRoots storage
       this.shadowRoots = {};
+      // storage for closeable observers.
+      this._observers = [];
       // install property observers
-      this.createPropertyObserver();
-      // TODO (sorvell): temporarily open observer when created
-      this.openPropertyObserver();
+      this.observeProperties();
       // install boilerplate attributes
       this.copyInstanceAttributes();
       // process input attributes
       this.takeAttributes();
       // add event listeners
       this.addHostListeners();
-    },
-    makeElementReady: function() {
-      if (this._readied) {
-        return;
-      }
-      this._readied = true;
-      // TODO(sorvell): We could create an entry point here
-      // for the user to compute property values.
       // process declarative resources
       this.parseDeclarations(this.__proto__);
       // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
@@ -4568,9 +977,6 @@
       this.removeAttribute('unresolved');
       // user entry point
       this.ready();
-      // TODO (sorvell): temporarily open observer when created
-      // turn on property observation and take any initial changes
-      //this.openPropertyObserver();
     },
     attachedCallback: function() {
       this.cancelUnbindAll();
@@ -4662,11 +1068,11 @@
     // utility function that stamps a <template> into light-dom
     lightFromTemplate: function(template, refNode) {
       if (template) {
-        // TODO(sorvell): mark this element as an eventController so that
+        // 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.eventController = this;
+        this.lightDomController = true;
         // stamp template
         // which includes parsing and applying MDV bindings before being 
         // inserted (to avoid {{}} in attribute values)
@@ -4687,8 +1093,8 @@
     shadowRootReady: function(root) {
       // locate nodes with id and store references to them in this.$ hash
       this.marshalNodeReferences(root);
-      // set up polymer gestures
-      PolymerGestures.register(root);
+      // set up pointer gestures
+      PointerGestures.register(root);
     },
     // locate nodes with id and store references to them in this.$ hash
     marshalNodeReferences: function(root) {
@@ -4740,14 +1146,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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
@@ -4847,14 +1249,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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
@@ -4950,13 +1348,10 @@
 
 })(Polymer);
 
-/*
- * 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
+/* 
+ * 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) {
@@ -4982,14 +1377,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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
@@ -5009,17 +1400,14 @@
   var styles = {
     // returns true if resources are loading
     loadStyles: function(callback) {
-      var template = this.fetchTemplate();
-      var content = template && this.templateContent();
+      var content = this.templateContent();
       if (content) {
         this.convertSheetsToStyles(content);
-        var styles = this.findLoadableStyles(content);
-        if (styles.length) {
-          var templateUrl = template.ownerDocument.baseURI;
-          return Platform.styleResolver.loadStyles(styles, templateUrl, callback);
-        }
       }
-      if (callback) {
+      var styles = this.findLoadableStyles(content);
+      if (styles.length) {
+        Platform.styleResolver.loadStyles(styles, callback);
+      } else if (callback) {
         callback();
       }
     },
@@ -5115,6 +1503,10 @@
       }
       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.
@@ -5226,12 +1618,9 @@
 })(Polymer);
 
 /*
- * 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
+ * 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) {
@@ -5243,19 +1632,7 @@
   var EVENT_PREFIX = api.EVENT_PREFIX;
   // polymer-element declarative api: events feature
 
-  var mixedCaseEventTypes = {};
-  [
-    'webkitAnimationStart',
-    'webkitAnimationEnd',
-    'webkitTransitionEnd',
-    'DOMFocusOut',
-    'DOMFocusIn',
-    'DOMMouseScroll'
-  ].forEach(function(e) {
-    mixedCaseEventTypes[e.toLowerCase()] = e;
-  });
-
-  var events = {
+  var events = { 
     parseHostEvents: function() {
       // our delegates map
       var delegates = this.prototype.eventDelegates;
@@ -5279,59 +1656,6 @@
     },
     removeEventPrefix: function(n) {
       return n.slice(prefixLength);
-    },
-    findController: function(node) {
-      while (node.parentNode) {
-        if (node.eventController) {
-          return node.eventController;
-        }
-        node = node.parentNode;
-      }
-      return node.host;
-    },
-    getEventHandler: function(controller, target, method) {
-      var events = this;
-      return function(e) {
-        if (!controller || !controller.PolymerBase) {
-          controller = events.findController(target);
-        }
-
-        var args = [e, e.detail, e.currentTarget];
-        controller.dispatchMethod(controller, method, args);
-      };
-    },
-    prepareEventBinding: function(pathString, name, node) {
-      if (!this.hasEventPrefix(name))
-        return;
-
-      var eventType = this.removeEventPrefix(name);
-      eventType = mixedCaseEventTypes[eventType] || eventType;
-
-      var events = this;
-
-      return function(model, node, oneTime) {
-        var handler = events.getEventHandler(undefined, node, pathString);
-        node.addEventListener(eventType, handler);
-
-        if (oneTime)
-          return;
-
-        // TODO(rafaelw): This is really pointless work. Aside from the cost
-        // of these allocations, NodeBind is going to setAttribute back to its
-        // current value. Fixing this would mean changing the TemplateBinding
-        // binding delegate API.
-        function bindingValue() {
-          return '{{ ' + pathString + ' }}';
-        }
-
-        return {
-          open: bindingValue,
-          discardChanges: bindingValue,
-          close: function() {
-            node.removeEventListener(eventType, handler);
-          }
-        };
-      };
     }
   };
 
@@ -5341,141 +1665,99 @@
   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 (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(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);
-      }
-    },
-    // 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 
-      for (var n in propertyDescriptors) {
-        var propertyDescriptor = propertyDescriptors[n];
-        var reflects = this.reflectHintForDescriptor(propertyDescriptor);
-        if (prototype.reflect[n] === undefined && reflects !== undefined) {
-          prototype.reflect[n] = reflects;
-        }
-        if (prototype[n] === undefined) {
-          prototype[n] = this.valueForDescriptor(propertyDescriptor); 
-        }
-      }
-    },
-    valueForDescriptor: function(propertyDescriptor) {
-      var value = typeof propertyDescriptor === 'object' && 
-          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;
-      return value !== undefined ? value : null;
-    },
-    // returns the value of the descriptor's 'reflect' property or undefined
-    reflectHintForDescriptor: function(propertyDescriptor) {
-      if (typeof propertyDescriptor === 'object' &&
-          propertyDescriptor && propertyDescriptor.reflect !== undefined) {
-        return propertyDescriptor.reflect;
-      }
-    },
-    lowerCaseMap: function(properties) {
-      var map = {};
-      for (var n in properties) {
-        map[n.toLowerCase()] = n;
-      }
-      return map;
-    },
-    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);
-        }
-      }
-    }
-  };
-
-  // exports
-
-  scope.api.declaration.properties = properties;
-
-})(Polymer);
-
-/*
- * 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
+ * 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) {
 
@@ -5487,14 +1769,12 @@
   // 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);
@@ -5509,14 +1789,11 @@
           n = names[i].trim();
           // do not override explicit entries
           if (n && publish[n] === undefined && base[n] === undefined) {
-            // supply an empty 'descriptor' object and let the publishProperties
-            // code determine a default
-            publish[n] = Polymer.nob;
+            publish[n] = null;
           }
         }
       }
     },
-
     // record clonable attributes from <element>
     accumulateInstanceAttributes: function() {
       // inherit instance attributes
@@ -5529,11 +1806,9 @@
         }
       }
     },
-
     isInstanceAttribute: function(name) {
       return !this.blackList[name] && name.slice(0,3) !== 'on-';
     },
-
     // do not clone these attributes onto instances
     blackList: {
       name: 1,
@@ -5543,7 +1818,6 @@
       assetpath: 1,
       'cache-csstext': 1
     }
-    
   };
 
   // add ATTRIBUTES_ATTRIBUTE to the blacklist
@@ -5556,60 +1830,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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 events = scope.api.declaration.events;
-
-  var syntax = new PolymerExpressions();
-  var prepareBinding = syntax.prepareBinding;
-
-  // Polymer takes a first crack at the binding to see if it's a declarative
-  // event handler.
-  syntax.prepareBinding = function(pathString, name, node) {
-    return events.prepareEventBinding(pathString, name, node) ||
-           prepareBinding.call(syntax, pathString, name, node);
-  };
-
-  // declaration api supporting mdv
-  var mdv = {
-    syntax: syntax,
-    fetchTemplate: function() {
-      return this.querySelector('template');
-    },
-    templateContent: function() {
-      var template = this.fetchTemplate();
-      return template && Platform.templateContent(template);
-    },
-    installBindingDelegate: function(template) {
-      if (template) {
-        template.bindingDelegate = this.syntax;
-      }
-    }
-  };
-
-  // exports
-  scope.api.declaration.mdv = mdv;
-
-})(Polymer);
-
-/*
- * 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(scope) {
 
   // imports
@@ -5673,8 +1897,6 @@
       this.inheritObject('observe', prototype, base);
       // chain publish object to inherited
       this.inheritObject('publish', prototype, base);
-      // chain reflect object to inherited
-      this.inheritObject('reflect', 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
@@ -5687,9 +1909,6 @@
     desugarAfterChaining: function(name, extendee) {
       // build side-chained lists to optimize iterations
       this.optimizePropertyMaps(this.prototype);
-      this.createPropertyAccessors(this.prototype);
-      // install mdv delegate on template
-      this.installBindingDelegate(this.fetchTemplate());
       // install external stylesheets as if they are inline
       this.installSheets();
       // adjust any paths in dom from imports
@@ -5855,43 +2074,16 @@
 })(Polymer);
 
 /*
- * 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
+ * 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) {
 
-  /*
-
-    Elements are added to a registration queue so that they register in 
-    the proper order at the appropriate time. We do this for a few reasons:
-
-    * to enable elements to load resources (like stylesheets) 
-    asynchronously. We need to do this until the platform provides an efficient
-    alternative. One issue is that remote @import stylesheets are 
-    re-fetched whenever stamped into a shadowRoot.
-
-    * to ensure elements loaded 'at the same time' (e.g. via some set of
-    imports) are registered as a batch. This allows elements to be enured from
-    upgrade ordering as long as they query the dom tree 1 task after
-    upgrade (aka domReady). This is a performance tradeoff. On the one hand,
-    elements that could register while imports are loading are prevented from 
-    doing so. On the other, grouping upgrades into a single task means less
-    incremental work (for example style recalcs),  Also, we can ensure the 
-    document is in a known state at the single quantum of time when 
-    elements upgrade.
-
-  */
   var queue = {
     // tell the queue to wait for an element to be ready
     wait: function(element, check, go) {
-      var shouldAdd = (this.indexOf(element) === -1 && 
-          flushQueue.indexOf(element) === -1);
-      if (shouldAdd) {
+      if (this.indexOf(element) === -1) {
         this.add(element);
         element.__check = check;
         element.__go = go;
@@ -5914,7 +2106,8 @@
     go: function(element) {
       var readied = this.remove(element);
       if (readied) {
-        this.addToFlushQueue(readied);
+        readied.__go.call(readied);
+        readied.__check = readied.__go = null;
         this.check();
       }
     },
@@ -5946,19 +2139,7 @@
     isEmpty: function() {
       return !importQueue.length && !mainQueue.length;
     },
-    addToFlushQueue: function(element) {
-      flushQueue.push(element);  
-    },
-    flush: function() {
-      var element;
-      while (flushQueue.length) {
-        element = flushQueue.shift();
-        element.__go.call(element);
-        element.__check = element.__go = null;
-      }
-    },
     ready: function() {
-      this.flush();
       // 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
@@ -5969,15 +2150,6 @@
         CustomElements.upgradeDocumentTree(document);
         CustomElements.ready = true;
       }
-      Platform.flush();
-      requestAnimationFrame(this.flushReadyCallbacks);
-    },
-    addReadyCallback: function(callback) {
-      if (callback) {
-        readyCallbacks.push(callback);
-      }
-    },
-    flushReadyCallbacks: function() {
       if (readyCallbacks) {
         var fn;
         while (readyCallbacks.length) {
@@ -5986,11 +2158,14 @@
         }
       }
     },
+    addReadyCallback: function(callback) {
+      if (callback) {
+        readyCallbacks.push(callback);
+      }
+    },
     waitToReady: true
   };
 
-  var flushQueue = [];
-
   var importQueue = [];
   var mainQueue = [];
   var readyCallbacks = [];
@@ -6025,14 +2200,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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;
@@ -6068,14 +2239,10 @@
 })(Polymer);
 
 /*
- * 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
+ * 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
@@ -6203,6 +2370,10 @@
     return (name && name.indexOf('-') >= 0);
   }
 
+  // exports
+
+  scope.getRegisteredPrototype = getRegisteredPrototype;
+  
   // boot tasks
 
   whenPolymerReady(function() {
@@ -6218,90 +2389,4 @@
 
 })(Polymer);
 
-/*
- * 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
- */
-
-/**
- * The `auto-binding` element extends the template element. It provides a quick 
- * and easy way to do data binding without the need to setup a model. 
- * The `auto-binding` element itself serves as the model and controller for the 
- * elements it contains. Both data and event handlers can be bound. 
- *
- * The `auto-binding` 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="auto-binding">
- *       <div>Say something: <input value="{{value}}"></div>
- *       <div>You said: {{value}}</div>
- *       <button on-tap="{{buttonTap}}">Tap me!</button>
- *     </template>
- *     <script>
- *       var template = document.querySelector('template');
- *       template.value = 'something';
- *       template.buttonTap = function() {
- *         console.log('tap!');
- *       };
- *     </script>
- *
- * @module Polymer
- * @status stable
-*/
-
-(function() {
-
-  var element = document.createElement('polymer-element');
-  element.setAttribute('name', 'auto-binding');
-  element.setAttribute('extends', 'template');
-  element.init();
-
-  Polymer('auto-binding', {
-
-    createdCallback: function() {
-      this.syntax = this.bindingDelegate = this.makeSyntax();
-      // delay stamping until polymer-ready so that auto-binding is not
-      // required to load last.
-      Polymer.whenPolymerReady(function() {
-        this.model = this;
-        this.setAttribute('bind', '');
-        // we don't bother with an explicit signal here, we could ust a MO
-        // if necessary
-        this.async(function() {
-          // note: this will marshall *all* the elements in the parentNode
-          // rather than just stamped ones. We'd need to use createInstance
-          // to fix this or something else fancier.
-          this.marshalNodeReferences(this.parentNode);
-          // template stamping is asynchronous so stamping isn't complete
-          // by polymer-ready; fire an event so users can use stamped elements
-          this.fire('template-bound');
-        });
-      }.bind(this));
-    },
-
-    makeSyntax: function() {
-      var events = Object.create(Polymer.api.declaration.events);
-      var self = this;
-      events.findController = function() { return self.model; };
-
-      var syntax = new PolymerExpressions();
-      var prepareBinding = syntax.prepareBinding;  
-      syntax.prepareBinding = function(pathString, name, node) {
-        return events.prepareEventBinding(pathString, name, node) ||
-               prepareBinding.call(syntax, pathString, name, node);
-      };
-      return syntax;
-    }
-
-  });
-
-})();
-
 //# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
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..eed265f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -2,24 +2,7 @@
   "version": 3,
   "file": "polymer.concat.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",
-    "build/polymer-versioned.js",
+    "src/polymer.js",
     "src/boot.js",
     "src/lib/lang.js",
     "src/lib/job.js",
@@ -40,59 +23,38 @@
     "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"
+    "src/declaration/polymer-element.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;;ACLA;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;;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;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,Y;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;;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;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 * 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"
+    "/*\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 */\nPolymer = {};\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// 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 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  // 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 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  // 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 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  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",
+    "/*\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    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\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  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 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  // 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 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  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 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\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      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\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 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\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 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  // 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    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        // keep track of property observer so we can shut it down\n        this.registerObservers([o]);\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.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        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\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) {\n      // apply Polymer two-way reference binding\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.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\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        var keys=Object.keys(this._namedObservers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._namedObservers[k];\n          o.close();\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(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\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  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\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(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      var dom = template.createInstance(this, 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);\n        this.reflectPropertyToAttribute(property);\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) {\n          observer.path = observable.path_;\n          this.bindings_ = this.bindings_ || {};\n          this.bindings_[name] = observer;\n        }\n        return observer;\n      }\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 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  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    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // storage for closeable observers.\n      this._observers = [];\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\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    },\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 a lightDOMController 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.lightDomController = true;\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 pointer gestures\n      PointerGestures.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 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  // 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 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  // 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 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 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 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  // 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 content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else 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    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\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 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\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 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  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);",
+    "/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // element api\r\n\r\n  var properties = {\r\n    inferObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var observe = prototype.observe, property;\r\n      for (var n in prototype) {\r\n        if (n.slice(-7) === 'Changed') {\r\n          if (!observe) {\r\n            observe  = (prototype.observe = {});\r\n          }\r\n          property = n.slice(0, -7)\r\n          observe[property] = observe[property] || n;\r\n        }\r\n      }\r\n    },\r\n    explodeObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var o = prototype.observe;\r\n      if (o) {\r\n        var exploded = {};\r\n        for (var n in o) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            exploded[ni] = o[n];\r\n          }\r\n        }\r\n        prototype.observe = exploded;\r\n      }\r\n    },\r\n    optimizePropertyMaps: function(prototype) {\r\n      if (prototype.observe) {\r\n        // construct name list\r\n        var a = prototype._observeNames = [];\r\n        for (var n in prototype.observe) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            a.push(ni);\r\n          }\r\n        }\r\n      }\r\n      if (prototype.publish) {\r\n        // construct name list\r\n        var a = prototype._publishNames = [];\r\n        for (var n in prototype.publish) {\r\n          a.push(n);\r\n        }\r\n      }\r\n    },\r\n    publishProperties: function(prototype, base) {\r\n      // if we have any properties to publish\r\n      var publish = prototype.publish;\r\n      if (publish) {\r\n        // transcribe `publish` entries onto own prototype\r\n        this.requireProperties(publish, prototype, base);\r\n        // construct map of lower-cased property names\r\n        prototype._publishLC = this.lowerCaseMap(publish);\r\n      }\r\n    },\r\n    requireProperties: function(properties, prototype, base) {\r\n      // ensure a prototype value for each property\r\n      for (var n in properties) {\r\n        if (prototype[n] === undefined && base[n] === undefined) {\r\n          prototype[n] = properties[n];\r\n        }\r\n      }\r\n    },\r\n    lowerCaseMap: function(properties) {\r\n      var map = {};\r\n      for (var n in properties) {\r\n        map[n.toLowerCase()] = n;\r\n      }\r\n      return map;\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.declaration.properties = properties;\r\n\r\n})(Polymer);\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(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    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    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            publish[n] = null;\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    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\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  // 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 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  // 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 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      // 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 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  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\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        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\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    ready: function() {\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      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\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 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  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 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  // 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  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\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"
   ]
 }
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.html b/pkg/polymer/lib/src/js/polymer/polymer.html
index 7e3d8f1..7a92125 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.html
+++ b/pkg/polymer/lib/src/js/polymer/polymer.html
@@ -1,12 +1,8 @@
 <!--
-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
+ Copyright 2013 The Polymer Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style
+ license that can be found in the LICENSE file.
 -->
-
-<link rel="import" href="layout.html">
-
 <script src="polymer.js"></script>
+<!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+<link rel="import" href="polymer-body.html">
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 9691d8b..170c124 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -1,13 +1,33 @@
 /**
  * @license
- * 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
+ * Copyright (c) 2012-2014 The Polymer Authors. All rights reserved.
+ * 
+ * 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.
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * 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 THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS 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.
  */
-// @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.2.2-40bde06
+Polymer={},"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 c=b.caller,g=c.nom,h=c._super;if(h||(g||(g=c.nom=e.call(this,c)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(c,g,f(this))),h){var i=h[g];return i._super||d(i,g,h),i.apply(this,a||[])}}function c(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}}function d(a,b,d){return a._super=c(d,b,a),a._super&&(a._super[b].nom=b),a._super}function e(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 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);var d,e,f=this;for(var g in a)e=c+g,(d=PolymerExpressions.prepareEventBinding(Path.get(a[g]),e,{resolveEventHandler:function(a,b){var c=b.getValueFrom(f);return c?c.bind(f):void 0}}))(this,this,!1)},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){c.bind&&console.log(e,inB.localName||"object",inPath,a.localName,b);var f=d.discardChanges();return(null===f||void 0===f)&&d.setValue(a[b]),Observer.defineComputedProperty(a,b,d)}var c=window.logFlags||{},d={observeProperties:function(){var a=this._observeNames,b=this._publishNames;if(a&&a.length||b&&b.length){var c=this._propertyObserver=new CompoundObserver;this.registerObservers([c]);for(var d,e=0,f=a.length;f>e&&(d=a[e]);e++){c.addPath(this,d);var g=Object.getOwnPropertyDescriptor(this.__proto__,d);g&&g.value&&this.observeArrayValue(d,g.value,null)}for(var d,e=0,f=b.length;f>e&&(d=b[e]);e++)this.observe&&void 0!==this.observe[d]||c.addPath(this,d);c.open(this.notifyPropertyChanges,this)}},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)d=c[2*g+1],void 0!==this.publish[d]&&this.reflectPropertyToAttribute(d),e=this.observe[d],e&&(this.observeArrayValue(d,a[g],b[g]),f[e]||(f[e]=!0,this.invokeMethod(e,[b[g],a[g],arguments])))},observeArrayValue:function(a,b,d){var e=this.observe[a];if(e&&(Array.isArray(d)&&(c.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){c.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){return 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.push(a)},closeObservers:function(){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,b,c=Object.keys(this._namedObservers),d=0,e=c.length;e>d&&(a=c[d]);d++)b=this._namedObservers[a],b.close();this._namedObservers={}}}},e="[%s]: bindProperties: [%s] to [%s].[%s]";a.api.instance.properties=d}(Polymer),function(a){function b(a){for(;a.parentNode;){if(a.lightDomController)return a;a=a.parentNode}return a.host}var c=window.logFlags||0,d=(a.api.instance.events,new PolymerExpressions);d.resolveEventHandler=function(a,c,d){var e=b(d);if(e){var f=c.getValueFrom(e);if(f)return f.bind(e)}};var e={syntax:d,instanceTemplate:function(a){var b=a.createInstance(this,this.syntax);return this.registerObservers(b.bindings_),b},bind:function(a,b){var c=this.propertyForAttribute(a);if(c){var d=this.bindProperty(c,b);return this.reflectPropertyToAttribute(c),Platform.enableBindingsReflection&&(d.path=b.path_,this.bindings_=this.bindings_||{},this.bindings_[a]=d),d}return this.mixinSuper(arguments)},asyncUnbindAll:function(){this._unbound||(c.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(c.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(c.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},f=/\{\{([^{}]*)}}/;a.bindPattern=f,a.api.instance.mdv=e}(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()},prepareElement:function(){this._elementPrepared=!0,this.shadowRoots={},this._observers=[],this.observeProperties(),this.copyInstanceAttributes(),this.takeAttributes(),this.addHostListeners(),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.lightDomController=!0;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PointerGestures.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.templateContent();b&&this.convertSheetsToStyles(b);var c=this.findLoadableStyles(b);c.length?Platform.styleResolver.loadStyles(c,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},templateContent:function(){var a=this.querySelector("template");return a&&templateContent(a)},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={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(e)}},e=c.length;a.api.declaration.events=d}(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,c){for(var d in a)void 0===b[d]&&void 0===c[d]&&(b[d]=a[d])},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b}};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]=null)},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){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("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),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)?g:f}function c(){return f.length?f[0]:g[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){return-1===this.indexOf(a)&&(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?f.length:1e9),c},go:function(a){var b=this.remove(a);b&&(b.__go.call(b),b.__check=b.__go=null,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!f.length&&!g.length},ready:function(){if(CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),h)for(var a;h.length;)(a=h.shift())()},addReadyCallback:function(a){a&&h.push(a)},waitToReady:!0},f=[],g=[],h=[];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),a.getRegisteredPrototype=h,g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer);
 //# 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..81a7e7a 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":["../src/polymer.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/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js"],"names":["Polymer","window","scope","extend","prototype","api","Object","getOwnPropertyNames","forEach","n","pd","getOwnPropertyDescriptor","defineProperty","value","nom","job","callback","wait","stop","Job","this","go","inContext","context","boundComplete","complete","bind","h","setTimeout","handle","clearTimeout","requestAnimationFrame","cancelAnimationFrame","call","registry","HTMLElement","register","tag","getPrototypeForTag","getPrototypeOf","document","createElement","originalStopPropagation","Event","stopPropagation","cancelBubble","apply","arguments","$super","arrayOfArgs","caller","_super","nameInThis","console","warn","memoizeSuper","fn","nextSuper","proto","name","method","p","__proto__","n$","i","l","length","d","super","deserializeValue","currentValue","inferredType","Date","typeHandlers","string","date","parse","now","boolean","number","parseFloat","parseInt","isNaN","object","JSON","replace","e","function","declaration","instance","publish","apis","utils","async","args","timeout","Platform","flush","cancelAsync","fire","type","detail","onNode","bubbles","cancelable","node","event","CustomEvent","undefined","dispatchEvent","asyncFire","classFollows","anew","old","className","classList","remove","add","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","events","addHostListeners","eventDelegates","keys","localName","bindable","eventName","self","PolymerExpressions","prepareEventBinding","Path","get","resolveEventHandler","model","path","getValueFrom","dispatchMethod","obj","group","groupEnd","attributes","copyInstanceAttributes","a$","_instanceAttributes","k","hasAttribute","setAttribute","takeAttributes","_publishLC","a","attributeToProperty","propertyForAttribute","search","bindPattern","match","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","bindProperties","inA","inProperty","observable","LOG_BIND_PROPS","inB","inPath","v","discardChanges","setValue","Observer","defineComputedProperty","properties","observeProperties","_observeNames","pn$","_publishNames","o","_propertyObserver","CompoundObserver","registerObservers","addPath","observeArrayValue","observe","open","notifyPropertyChanges","newValues","oldValues","paths","called","invokeMethod","callbackName","Array","isArray","closeNamedObserver","observer","ArrayObserver","registerNamedObserver","bindProperty","property","observers","_observers","push","closeObservers","closeObserverArray","observerArray","close","o$","_namedObservers","closeNamedObservers","findEventController","parentNode","lightDomController","host","syntax","ctlr","mdv","instanceTemplate","template","dom","createInstance","bindings_","enableBindingsReflection","path_","mixinSuper","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","hasOwnProperty","PolymerBase","base","created","ready","createdCallback","templateInstance","prepareElement","_elementPrepared","shadowRoots","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","element","parseDeclaration","elementElement","fetchTemplate","root","shadowFromTemplate","querySelector","createShadowRoot","appendChild","shadowRootReady","lightFromTemplate","refNode","insertBefore","marshalNodeReferences","PointerGestures","$","querySelectorAll","id","attributeChangedCallback","getAttribute","attributeChanged","onMutation","listener","MutationObserver","mutations","disconnect","childList","subtree","constructor","Base","shimCssText","cssText","is","selector","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","styles","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","style","s","textContent","ShadowDOMPolyfill","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","ownerDocument","baseURI","resolvePath","urlPath","u","href","importRuleForSheet","sheet","baseUrl","head","clone","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","styleResolver","c","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","removeChild","filter","firstChild","matcher","nodes","array","templateNodes","concat","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","slice","prefixLength","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","publishProperties","requireProperties","lowerCaseMap","map","toLowerCase","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","create","mixinMethod","source","info","typeExtension","findTypeExtension","registerElement","indexOf","inherited","queueForElement","contains","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","__check","__go","useNative","readied","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","readyCallbacks","addEventListener","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","Boolean","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKAA,WCI8B,kBAAnBC,QAAOD,UAChBA,YCLF,SAAUE,GAGR,QAASC,GAAOC,EAAWC,GAiBzB,MAhBID,IAAaC,GAEfC,OAAOC,oBAAoBF,GAAKG,QAAQ,SAASC,GAE/C,GAAIC,GAAKJ,OAAOK,yBAAyBN,EAAKI,EAC1CC,KAEFJ,OAAOM,eAAeR,EAAWK,EAAGC,GAEb,kBAAZA,GAAGG,QAEZH,EAAGG,MAAMC,IAAML,MAKhBL,EAKTF,EAAMC,OAASA,GAEdH,SC1BH,SAAUE,GA6CR,QAASa,GAAIA,EAAKC,EAAUC,GAO1B,MANIF,GACFA,EAAIG,OAEJH,EAAM,GAAII,GAAIC,MAEhBL,EAAIM,GAAGL,EAAUC,GACVF,EAzCT,GAAII,GAAM,SAASG,GACjBF,KAAKG,QAAUD,EACfF,KAAKI,cAAgBJ,KAAKK,SAASC,KAAKN,MAE1CD,GAAIf,WACFiB,GAAI,SAASL,EAAUC,GACrBG,KAAKJ,SAAWA,CAChB,IAAIW,EACCV,IAMHU,EAAIC,WAAWR,KAAKI,cAAeP,GACnCG,KAAKS,OAAS,WACZC,aAAaH,MAPfA,EAAII,sBAAsBX,KAAKI,eAC/BJ,KAAKS,OAAS,WACZG,qBAAqBL,MAS3BT,KAAM,WACAE,KAAKS,SACPT,KAAKS,SACLT,KAAKS,OAAS,OAGlBJ,SAAU,WACJL,KAAKS,SACPT,KAAKF,OACLE,KAAKJ,SAASiB,KAAKb,KAAKG,YAiB9BrB,EAAMa,IAAMA,GAEXf,SC5DH,WAEE,GAAIkC,KAEJC,aAAYC,SAAW,SAASC,EAAKjC,GACnC8B,EAASG,GAAOjC,GAIlB+B,YAAYG,mBAAqB,SAASD,GACxC,GAAIjC,GAAaiC,EAA8BH,EAASG,GAAjCF,YAAY/B,SAEnC,OAAOA,IAAaE,OAAOiC,eAAeC,SAASC,cAAcJ,IAInE,IAAIK,GAA0BC,MAAMvC,UAAUwC,eAC9CD,OAAMvC,UAAUwC,gBAAkB,WAChCxB,KAAKyB,cAAe,EACpBH,EAAwBI,MAAM1B,KAAM2B,aASrC/C,SC5BF,SAAUE,GAgBP,QAAS8C,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBpC,EAAMoC,EAAOpC,IAEbqC,EAASD,EAAOC,MAYpB,IAXKA,IACErC,IACHA,EAAMoC,EAAOpC,IAAMsC,EAAWnB,KAAKb,KAAM8B,IAEtCpC,GACHuC,QAAQC,KAAK,iFAIfH,EAASI,EAAaL,EAAQpC,EAAKyB,EAAenB,QAE/C+B,EAGE,CAEL,GAAIK,GAAKL,EAAOrC,EAOhB,OALK0C,GAAGL,QACNI,EAAaC,EAAI1C,EAAKqC,GAIjBK,EAAGV,MAAM1B,KAAM6B,QAI1B,QAASQ,GAAUC,EAAOC,EAAMT,GAE9B,KAAOQ,GAAO,CACZ,GAAKA,EAAMC,KAAUT,GAAWQ,EAAMC,GACpC,MAAOD,EAETA,GAAQnB,EAAemB,IAI3B,QAASH,GAAaK,EAAQD,EAAMD,GAUlC,MANAE,GAAOT,OAASM,EAAUC,EAAOC,EAAMC,GACnCA,EAAOT,SAGTS,EAAOT,OAAOQ,GAAM7C,IAAM6C,GAErBC,EAAOT,OAGhB,QAASC,GAAWvC,GAElB,IADA,GAAIgD,GAAIzC,KAAK0C,UACND,GAAKA,IAAM1B,YAAY/B,WAAW,CAGvC,IAAK,GAAsBK,GADvBsD,EAAKzD,OAAOC,oBAAoBsD,GAC3BG,EAAE,EAAGC,EAAEF,EAAGG,OAAaD,EAAFD,IAAQvD,EAAEsD,EAAGC,IAAKA,IAAK,CACnD,GAAIG,GAAI7D,OAAOK,yBAAyBkD,EAAGpD,EAC3C,IAAuB,kBAAZ0D,GAAEtD,OAAwBsD,EAAEtD,QAAUA,EAC/C,MAAOJ,GAGXoD,EAAIA,EAAEC,WAOV,QAASvB,GAAenC,GACtB,MAAOA,GAAU0D,UAkBnB5D,EAAMkE,MAAQpB,GAEfhD,SCnHH,SAAUE,GA8CR,QAASmE,GAAiBxD,EAAOyD,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwBE,QAC1BD,EAAe,QAGVE,EAAaF,GAAc1D,EAAOyD,GApD3C,GAAIG,IACFC,OAAQ,SAAS7D,GACf,MAAOA,IAET8D,KAAM,SAAS9D,GACb,MAAO,IAAI2D,MAAKA,KAAKI,MAAM/D,IAAU2D,KAAKK,QAE5CC,UAAS,SAASjE,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvCkE,OAAQ,SAASlE,GACf,GAAIJ,GAAIuE,WAAWnE,EAKnB,OAHU,KAANJ,IACFA,EAAIwE,SAASpE,IAERqE,MAAMzE,GAAKI,EAAQJ,GAK5B0E,OAAQ,SAAStE,EAAOyD,GACtB,GAAqB,OAAjBA,EACF,MAAOzD,EAET,KAIE,MAAOuE,MAAKR,MAAM/D,EAAMwE,QAAQ,KAAM,MACtC,MAAMC,GAEN,MAAOzE,KAIX0E,WAAY,SAAS1E,EAAOyD,GAC1B,MAAOA,IAiBXpE,GAAMmE,iBAAmBA,GAExBrE,SC9DH,SAAUE,GAIR,GAAIC,GAASD,EAAMC,OAIfE,IAEJA,GAAImF,eACJnF,EAAIoF,YAEJpF,EAAIqF,QAAU,SAASC,EAAMvF,GAC3B,IAAK,GAAIK,KAAKkF,GACZxF,EAAOC,EAAWuF,EAAKlF,KAM3BP,EAAMG,IAAMA,GAEXL,SCvBH,SAAUE,GAER,GAAI0F,IASFC,MAAO,SAASjC,EAAQkC,EAAMC,GAG5BC,SAASC,QAETH,EAAQA,GAAQA,EAAK5B,OAAU4B,GAAQA,EAEvC,IAAItC,GAAK,YACNpC,KAAKwC,IAAWA,GAAQd,MAAM1B,KAAM0E,IACrCpE,KAAKN,MAEHS,EAASkE,EAAUnE,WAAW4B,EAAIuC,GAClChE,sBAAsByB,EAE1B,OAAOuC,GAAUlE,GAAUA,GAE7BqE,YAAa,SAASrE,GACP,EAATA,EACFG,sBAAsBH,GAEtBC,aAAaD,IAWjBsE,KAAM,SAASC,EAAMC,EAAQC,EAAQC,EAASC,GAC5C,GAAIC,GAAOH,GAAUlF,KACjBiF,EAASA,MACTK,EAAQ,GAAIC,aAAYP,GAC1BG,QAAsBK,SAAZL,EAAwBA,GAAU,EAC5CC,WAA4BI,SAAfJ,EAA2BA,GAAa,EACrDH,OAAQA,GAGV,OADAI,GAAKI,cAAcH,GACZA,GASTI,UAAW,WACT1F,KAAKyE,MAAM,OAAQ9C,YASrBgE,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAUC,OAAOF,GAEnBF,GACFA,EAAKG,UAAUE,IAAIH,KAMrBI,EAAM,aAGNC,IAIJ3B,GAAM4B,YAAc5B,EAAMC,MAI1B3F,EAAMG,IAAIoF,SAASG,MAAQA,EAC3B1F,EAAMoH,IAAMA,EACZpH,EAAMqH,IAAMA,GAEXvH,SC/FH,SAAUE,GAIR,GAAIuH,GAAMxH,OAAOyH,aACbC,EAAe,MAGfC,GAEFD,aAAcA,EAEdE,iBAAkB,WAChB,GAAID,GAASxG,KAAK0G,cAClBL,GAAIG,QAAWtH,OAAOyH,KAAKH,GAAQ1D,OAAS,GAAMb,QAAQoE,IAAI,yBAA0BrG,KAAK4G,UAAWJ,EAOxG,IAAiBK,GAAUC,EAAvBC,EAAO/G,IACX,KAAK,GAAIX,KAAKmH,GACZM,EAAYP,EAAelH,GAC3BwH,EAAWG,mBAAmBC,oBAC5BC,KAAKC,IAAIX,EAAOnH,IAChByH,GAEEM,oBAAqB,SAASC,EAAOC,GACnC,GAAIlF,GAAKkF,EAAKC,aAAaR,EAC3B,OAAI3E,GACKA,EAAG9B,KAAKyG,GADjB,WAMG/G,KAAMA,MAAM,IAIzBwH,eAAgB,SAASC,EAAKjF,EAAQkC,GACpC,GAAI+C,EAAK,CACPpB,EAAIG,QAAUvE,QAAQyF,MAAM,qBAAsBD,EAAIb,UAAWpE,EACjE,IAAIJ,GAAuB,kBAAXI,GAAwBA,EAASiF,EAAIjF,EACjDJ,IACFA,EAAGsC,EAAO,QAAU,QAAQ+C,EAAK/C,GAEnC2B,EAAIG,QAAUvE,QAAQ0F,WACtB/C,SAASC,UAOf/F,GAAMG,IAAIoF,SAASmC,OAASA,GAE3B5H,SC1DH,SAAUE,GAIR,GAAI8I,IACFC,uBAAwB,WACtB,GAAIC,GAAK9H,KAAK+H,mBACd,KAAK,GAAIC,KAAKF,GACP9H,KAAKiI,aAAaD,IACrBhI,KAAKkI,aAAaF,EAAGF,EAAGE,KAK9BG,eAAgB,WAGd,GAAInI,KAAKoI,WACP,IAAK,GAA0CC,GAAtCzF,EAAE,EAAGkF,EAAG9H,KAAK4H,WAAY/E,EAAEiF,EAAGhF,QAAYuF,EAAEP,EAAGlF,KAASC,EAAFD,EAAKA,IAClE5C,KAAKsI,oBAAoBD,EAAE9F,KAAM8F,EAAE5I,QAMzC6I,oBAAqB,SAAS/F,EAAM9C,GAGlC,GAAI8C,GAAOvC,KAAKuI,qBAAqBhG,EACrC,IAAIA,EAAM,CAIR,GAAI9C,GAASA,EAAM+I,OAAO1J,EAAM2J,cAAgB,EAC9C,MAGF,IAAIvF,GAAelD,KAAKuC,GAEpB9C,EAAQO,KAAKiD,iBAAiBxD,EAAOyD,EAErCzD,KAAUyD,IAEZlD,KAAKuC,GAAQ9C,KAKnB8I,qBAAsB,SAAShG,GAC7B,GAAImG,GAAQ1I,KAAKoI,YAAcpI,KAAKoI,WAAW7F,EAE/C,OAAOmG,IAGTzF,iBAAkB,SAAS0F,EAAazF,GACtC,MAAOpE,GAAMmE,iBAAiB0F,EAAazF,IAE7C0F,eAAgB,SAASnJ,EAAO0D,GAC9B,MAAqB,YAAjBA,EACK1D,EAAQ,GAAK+F,OACM,WAAjBrC,GAA8C,aAAjBA,GACvBqC,SAAV/F,EACEA,EAFF,QAKToJ,2BAA4B,SAAStG,GACnC,GAAIY,SAAsBnD,MAAKuC,GAE3BuG,EAAkB9I,KAAK4I,eAAe5I,KAAKuC,GAAOY,EAE9BqC,UAApBsD,EACF9I,KAAKkI,aAAa3F,EAAMuG,GAME,YAAjB3F,GACTnD,KAAK+I,gBAAgBxG,IAO3BzD,GAAMG,IAAIoF,SAASuD,WAAaA,GAE/BhJ,SCvFH,SAAUE,GAqIR,QAASkK,GAAeC,EAAKC,EAAYC,GACvC9C,EAAI/F,MAAQ2B,QAAQoE,IAAI+C,EAAgBC,IAAIzC,WAAa,SAAU0C,OAAQL,EAAIrC,UAAWsC,EAI1F,IAAIK,GAAIJ,EAAWK,gBAInB,QAHU,OAAND,GAAoB/D,SAAN+D,IAChBJ,EAAWM,SAASR,EAAIC,IAEnBQ,SAASC,uBAAuBV,EAAKC,EAAYC,GA1I1D,GAAI9C,GAAMxH,OAAOyH,aAUbsD,GACFC,kBAAmB,WACjB,GAAIlH,GAAK3C,KAAK8J,cAAeC,EAAM/J,KAAKgK,aACxC,IAAKrH,GAAMA,EAAGG,QAAYiH,GAAOA,EAAIjH,OAAS,CAC5C,GACImH,GAAIjK,KAAKkK,kBAAoB,GAAIC,iBAErCnK,MAAKoK,mBAAmBH,GACxB,KAAK,GAAsB5K,GAAlBuD,EAAE,EAAGC,EAAEF,EAAGG,OAAcD,EAAFD,IAASvD,EAAEsD,EAAGC,IAAKA,IAAK,CACrDqH,EAAEI,QAAQrK,KAAMX,EAEhB,IAAIC,GAAKJ,OAAOK,yBAAyBS,KAAK0C,UAAWrD,EACrDC,IAAMA,EAAGG,OACXO,KAAKsK,kBAAkBjL,EAAGC,EAAGG,MAAO,MAGxC,IAAK,GAAuBJ,GAAnBuD,EAAE,EAAGC,EAAEkH,EAAIjH,OAAcD,EAAFD,IAASvD,EAAE0K,EAAInH,IAAKA,IAC7C5C,KAAKuK,SAAgC/E,SAApBxF,KAAKuK,QAAQlL,IACjC4K,EAAEI,QAAQrK,KAAMX,EAGpB4K,GAAEO,KAAKxK,KAAKyK,sBAAuBzK,QAGvCyK,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAIrI,GAAMC,EAAQqI,IAClB,KAAK,GAAIjI,KAAK+H,GAEZpI,EAAOqI,EAAM,EAAIhI,EAAI,GACM4C,SAAvBxF,KAAKsE,QAAQ/B,IACfvC,KAAK6I,2BAA2BtG,GAElCC,EAASxC,KAAKuK,QAAQhI,GAClBC,IACFxC,KAAKsK,kBAAkB/H,EAAMmI,EAAU9H,GAAI+H,EAAU/H,IAChDiI,EAAOrI,KACVqI,EAAOrI,IAAU,EAEjBxC,KAAK8K,aAAatI,GAASmI,EAAU/H,GAAI8H,EAAU9H,GAAIjB,eAK/D2I,kBAAmB,SAAS/H,EAAM9C,EAAOoG,GAEvC,GAAIkF,GAAe/K,KAAKuK,QAAQhI,EAChC,IAAIwI,IAEEC,MAAMC,QAAQpF,KAChBQ,EAAIkE,SAAWtI,QAAQoE,IAAI,mDAAoDrG,KAAK4G,UAAWrE,GAC/FvC,KAAKkL,mBAAmB3I,EAAO,YAG7ByI,MAAMC,QAAQxL,IAAQ,CACxB4G,EAAIkE,SAAWtI,QAAQoE,IAAI,iDAAkDrG,KAAK4G,UAAWrE,EAAM9C,EACnG,IAAI0L,GAAW,GAAIC,eAAc3L,EACjC0L,GAASX,KAAK,SAAS/K,EAAOoG,GAC5B7F,KAAK8K,aAAaC,GAAelF,KAChC7F,MACHA,KAAKqL,sBAAsB9I,EAAO,UAAW4I,KAInDG,aAAc,SAASC,EAAUpC,GAE/B,MAAOH,GAAehJ,KAAMuL,EAAUpC,IAExC2B,aAAc,SAAStI,EAAQkC,GAC7B,GAAItC,GAAKpC,KAAKwC,IAAWA,CACP,mBAAPJ,IACTA,EAAGV,MAAM1B,KAAM0E,IAGnB0F,kBAAmB,SAASoB,GAC1BxL,KAAKyL,WAAWC,KAAKF,IAGvBG,eAAgB,WACd,IAAK,GAAI/I,GAAE,EAAGC,EAAE7C,KAAKyL,WAAW3I,OAAUD,EAAFD,EAAKA,IAC3C5C,KAAK4L,mBAAmB5L,KAAKyL,WAAW7I,GAE1C5C,MAAKyL,eAEPG,mBAAoB,SAASC,GAC3B,IAAK,GAAiC5B,GAA7BrH,EAAE,EAAGC,EAAEgJ,EAAc/I,OAAaD,EAAFD,EAAKA,IAC5CqH,EAAI4B,EAAcjJ,GACdqH,GAAKA,EAAE6B,OACT7B,EAAE6B,SAKRT,sBAAuB,SAAS9I,EAAM4I,GACpC,GAAIY,GAAK/L,KAAKgM,kBAAoBhM,KAAKgM,mBACvCD,GAAGxJ,GAAQ4I,GAEbD,mBAAoB,SAAS3I,GAC3B,GAAIwJ,GAAK/L,KAAKgM,eACd,OAAID,IAAMA,EAAGxJ,IACXwJ,EAAGxJ,GAAMuJ,QACTC,EAAGxJ,GAAQ,MACJ,GAHT,QAMF0J,oBAAqB,WACnB,GAAIjM,KAAKgM,gBAAiB,CAExB,IAAK,GAAwBhE,GAAGiC,EAD5BtD,EAAKzH,OAAOyH,KAAK3G,KAAKgM,iBACjBpJ,EAAE,EAAGC,EAAE8D,EAAK7D,OAAmBD,EAAJD,IAAWoF,EAAErB,EAAK/D,IAAKA,IACzDqH,EAAIjK,KAAKgM,gBAAgBhE,GACzBiC,EAAE6B,OAEJ9L,MAAKgM,sBAwBP5C,EAAiB,yCAIrBtK,GAAMG,IAAIoF,SAASuF,WAAaA,GAE/BhL,SC3JH,SAAUE,GAqBR,QAASoN,GAAoB7G,GAC3B,KAAOA,EAAK8G,YAAY,CACtB,GAAI9G,EAAK+G,mBACP,MAAO/G,EAETA,GAAOA,EAAK8G,WAEd,MAAO9G,GAAKgH,KAxBd,GAAIhG,GAAMxH,OAAOyH,UAAY,EAGzBgG,GAFSxN,EAAMG,IAAIoF,SAASmC,OAEnB,GAAIQ,oBACjBsF,GAAOlF,oBAAsB,SAASC,EAAOC,EAAMjC,GACjD,GAAIkH,GAAOL,EAAoB7G,EAC/B,IAAIkH,EAAM,CACR,GAAInK,GAAKkF,EAAKC,aAAagF,EAC3B,IAAInK,EACF,MAAOA,GAAG9B,KAAKiM,IAoBrB,IAAIC,IACFF,OAAQA,EACRG,iBAAkB,SAASC,GACzB,GAAIC,GAAMD,EAASE,eAAe5M,KAAMA,KAAKsM,OAE7C,OADAtM,MAAKoK,kBAAkBuC,EAAIE,WACpBF,GAETrM,KAAM,SAASiC,EAAM4G,GACnB,GAAIoC,GAAWvL,KAAKuI,qBAAqBhG,EACzC,IAAKgJ,EAIE,CAEL,GAAIJ,GAAWnL,KAAKsL,aAAaC,EAAUpC,EAS3C,OARAnJ,MAAK6I,2BAA2B0C,GAG5B3G,SAASkI,2BACX3B,EAAS7D,KAAO6B,EAAW4D,MAC3B/M,KAAK6M,UAAY7M,KAAK6M,cACtB7M,KAAK6M,UAAUtK,GAAQ4I,GAElBA,EAZP,MAAOnL,MAAKgN,WAAWrL,YAkB3BsL,eAAgB,WACTjN,KAAKkN,WACR7G,EAAI8G,QAAUlL,QAAQoE,IAAI,sBAAuBrG,KAAK4G,WACtD5G,KAAKoN,cAAgBpN,KAAKL,IAAIK,KAAKoN,cAAepN,KAAKqN,UAAW,KAGtEA,UAAW,WACJrN,KAAKkN,WACRlN,KAAK2L,iBACL3L,KAAKiM,sBACLjM,KAAKkN,UAAW,IAGpBI,gBAAiB,WACf,MAAItN,MAAKkN,cACP7G,EAAI8G,QAAUlL,QAAQC,KAAK,gDAAiDlC,KAAK4G,aAGnFP,EAAI8G,QAAUlL,QAAQoE,IAAI,uBAAwBrG,KAAK4G,gBACnD5G,KAAKoN,gBACPpN,KAAKoN,cAAgBpN,KAAKoN,cAActN,YAsB1CyN,EAAkB,gBAItBzO,GAAM2J,YAAc8E,EACpBzO,EAAMG,IAAIoF,SAASmI,IAAMA,GAExB5N,SChHH,SAAUE,GA0MR,QAAS0O,GAAOzJ,GACd,MAAOA,GAAO0J,eAAe,eAK/B,QAASC,MA9MT,GAAIC,IACFD,aAAa,EACb/N,IAAK,SAASA,EAAKC,EAAUC,GAC3B,GAAmB,gBAARF,GAIT,MAAOf,SAAQe,IAAIkB,KAAKb,KAAML,EAAKC,EAAUC,EAH7C,IAAIR,GAAI,MAAQM,CAChBK,MAAKX,GAAKT,QAAQe,IAAIkB,KAAKb,KAAMA,KAAKX,GAAIO,EAAUC,IAKxDmD,QAAOpE,QAAQoE,MAEf4K,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACX9N,KAAK+N,kBAAoB/N,KAAK+N,iBAAiB1G,OACjDpF,QAAQC,KAAK,iBAAmBlC,KAAK4G,UAAY,wGAInD5G,KAAK4N,UACL5N,KAAKgO,kBAGPA,eAAgB,WACdhO,KAAKiO,kBAAmB,EAExBjO,KAAKkO,eAELlO,KAAKyL,cAELzL,KAAK6J,oBAEL7J,KAAK6H,yBAEL7H,KAAKmI,iBAELnI,KAAKyG,mBAELzG,KAAKmO,kBAAkBnO,KAAK0C,WAI5B1C,KAAK+I,gBAAgB,cAErB/I,KAAK6N,SAEPO,iBAAkB,WAChBpO,KAAKsN,kBAEDtN,KAAKqO,UACPrO,KAAKqO,WAGHrO,KAAKsO,aACPtO,KAAKsO,cAMFtO,KAAKuO,kBACRvO,KAAKuO,iBAAkB,EACnBvO,KAAKwO,UACPxO,KAAKyE,MAAM,cAIjBgK,iBAAkB,WACXzO,KAAK0O,gBACR1O,KAAKiN,iBAGHjN,KAAK2O,UACP3O,KAAK2O,WAGH3O,KAAK4O,UACP5O,KAAK4O,YAITC,oBAAqB,WACnB7O,KAAKoO,oBAGPU,iBAAkB,WAChB9O,KAAKyO,oBAGPM,wBAAyB,WACvB/O,KAAKoO,oBAGPY,qBAAsB,WACpBhP,KAAKyO,oBAGPN,kBAAmB,SAAS1L,GACtBA,GAAKA,EAAEwM,UACTjP,KAAKmO,kBAAkB1L,EAAEC,WACzBD,EAAEyM,iBAAiBrO,KAAKb,KAAMyC,EAAEwM,WAIpCC,iBAAkB,SAASC,GACzB,GAAIzC,GAAW1M,KAAKoP,cAAcD,EAClC,IAAIzC,EAAU,CACZ,GAAI2C,GAAOrP,KAAKsP,mBAAmB5C,EACnC1M,MAAKkO,YAAYiB,EAAe5M,MAAQ8M,IAI5CD,cAAe,SAASD,GACtB,MAAOA,GAAeI,cAAc,aAGtCD,mBAAoB,SAAS5C,GAC3B,GAAIA,EAAU,CAEZ,GAAI2C,GAAOrP,KAAKwP,mBAKZ7C,EAAM3M,KAAKyM,iBAAiBC,EAMhC,OAJA2C,GAAKI,YAAY9C,GAEjB3M,KAAK0P,gBAAgBL,EAAM3C,GAEpB2C,IAIXM,kBAAmB,SAASjD,EAAUkD,GACpC,GAAIlD,EAAU,CAKZ1M,KAAKoM,oBAAqB,CAK1B,IAAIO,GAAM3M,KAAKyM,iBAAiBC,EAUhC,OARIkD,GACF5P,KAAK6P,aAAalD,EAAKiD,GAEvB5P,KAAKyP,YAAY9C,GAGnB3M,KAAK0P,gBAAgB1P,MAEd2M,IAGX+C,gBAAiB,SAASL,GAExBrP,KAAK8P,sBAAsBT,GAE3BU,gBAAgB/O,SAASqO,IAG3BS,sBAAuB,SAAST,GAE9B,GAAIW,GAAIhQ,KAAKgQ,EAAIhQ,KAAKgQ,KAEtB,IAAIX,EAEF,IAAK,GAAsBhQ,GADvBsD,EAAK0M,EAAKY,iBAAiB,QACtBrN,EAAE,EAAGC,EAAEF,EAAGG,OAAcD,EAAFD,IAASvD,EAAEsD,EAAGC,IAAKA,IAChDoN,EAAE3Q,EAAE6Q,IAAM7Q,GAIhB8Q,yBAA0B,SAAS5N,GAEpB,UAATA,GAA6B,UAATA,GACtBvC,KAAKsI,oBAAoB/F,EAAMvC,KAAKoQ,aAAa7N,IAE/CvC,KAAKqQ,kBACPrQ,KAAKqQ,iBAAiB3O,MAAM1B,KAAM2B,YAGtC2O,WAAY,SAASjL,EAAMkL,GACzB,GAAIpF,GAAW,GAAIqF,kBAAiB,SAASC,GAC3CF,EAAS1P,KAAKb,KAAMmL,EAAUsF,GAC9BtF,EAASuF,cACTpQ,KAAKN,MACPmL,GAASZ,QAAQlF,GAAOsL,WAAW,EAAMC,SAAS,KAYtDlD,GAAY1O,UAAY2O,EACxBA,EAAKkD,YAAcnD,EAInB5O,EAAMgS,KAAOpD,EACb5O,EAAM0O,OAASA,EACf1O,EAAMG,IAAIoF,SAASsJ,KAAOA,GAEzB/O,SC1NH,SAAUE,GA8ER,QAASqC,GAAenC,GACtB,MAAOA,GAAU0D,UAGnB,QAASqO,GAAYC,EAAS3E,GAC5B,GAAI9J,GAAO,GAAI0O,GAAK,CAChB5E,KACF9J,EAAO8J,EAAKzF,UACZqK,EAAK5E,EAAKpE,aAAa,MAEzB,IAAIiJ,GAAWtM,SAASuM,UAAUC,kBAAkB7O,EAAM0O,EAC1D,OAAOrM,UAASuM,UAAUJ,YAAYC,EAASE,GArFjD,GAIIG,IAJMxS,OAAOyH,aAIW,WACxBgL,EAAyB,aAEzBC,GACFF,sBAAuBA,EAMvBG,wBAAyB,WAEvB,GAAI1S,GAAQkB,KAAKyR,gBACjB,IAAI3S,IAAUkB,KAAK0R,mBAAmB5S,EAAOkB,KAAK4G,WAAY,CAG5D,IADA,GAAItE,GAAQnB,EAAenB,MAAOgR,EAAU,GACrC1O,GAASA,EAAM2M,SACpB+B,GAAW1O,EAAM2M,QAAQ0C,gBAAgBL,GACzChP,EAAQnB,EAAemB,EAErB0O,IACFhR,KAAK4R,oBAAoBZ,EAASlS,KAIxC+S,kBAAmB,SAASC,EAAOvP,EAAMzD,GACvC,GAAIA,GAAQA,GAASkB,KAAKyR,iBAAkBlP,EAAOA,GAAQ,EAC3D,IAAIzD,IAAUkB,KAAK0R,mBAAmB5S,EAAOkB,KAAK4G,UAAYrE,GAAO,CACnE,GAAIyO,GAAU,EACd,IAAIc,YAAiB9G,OACnB,IAAK,GAAyB+G,GAArBnP,EAAE,EAAGC,EAAEiP,EAAMhP,OAAcD,EAAFD,IAASmP,EAAED,EAAMlP,IAAKA,IACtDoO,GAAWe,EAAEC,YAAc,WAG7BhB,GAAUc,EAAME,WAElBhS,MAAK4R,oBAAoBZ,EAASlS,EAAOyD,KAG7CqP,oBAAqB,SAASZ,EAASlS,EAAOyD,GAG5C,GAFAzD,EAAQA,GAASkB,KAAKyR,iBACtBlP,EAAOA,GAAQ,GACVzD,EAAL,CAGID,OAAOoT,oBACTjB,EAAUD,EAAYC,EAASlS,EAAMuN,MAEvC,IAAIyF,GAAQ9R,KAAKiP,QAAQiD,oBAAoBlB,EACzCM,EACJ1S,SAAQuT,kBAAkBL,EAAOhT,GAEjCA,EAAMsT,aAAapS,KAAK4G,UAAYrE,IAAQ,IAE9CkP,eAAgB,SAASpM,GAGvB,IADA,GAAIhG,GAAIgG,GAAQrF,KACTX,EAAE8M,YACP9M,EAAIA,EAAE8M,UAER,OAAO9M,IAETqS,mBAAoB,SAAS5S,EAAOyD,GAElC,MADAzD,GAAMsT,aAAetT,EAAMsT,iBACpBtT,EAAMsT,aAAa7P,IAsB9BzD,GAAMG,IAAIoF,SAASkN,OAASA,GAE3B3S,SChGH,SAAUE,GAUR,QAASmQ,GAAQ1M,EAAMvD,GACrB,GAAyB,IAArB2C,UAAUmB,QAAwC,gBAAjBnB,WAAU,GAAiB,CAC9D3C,EAAYuD,CACZ,IAAI8P,GAASjR,SAASkR,cAGtB,IAFA/P,EAAO8P,GAAUA,EAAOlG,YAAckG,EAAOlG,WAAWiE,aACpDiC,EAAOlG,WAAWiE,aAAa,QAAU,IACxC7N,EACH,KAAM,sCAGV,GAAIgQ,EAAuBhQ,GACzB,KAAM,sDAAwDA,CAGhEiQ,GAAkBjQ,EAAMvD,GAExByT,EAAgBlQ,GAKlB,QAASmQ,GAAoBnQ,EAAMoQ,GACjCC,EAAcrQ,GAAQoQ,EAKxB,QAASF,GAAgBlQ,GACnBqQ,EAAcrQ,KAChBqQ,EAAcrQ,GAAMsQ,0BACbD,GAAcrQ,IAgBzB,QAASiQ,GAAkBjQ,EAAMvD,GAC/B,MAAO8T,GAAiBvQ,GAAQvD,MAGlC,QAASuT,GAAuBhQ,GAC9B,MAAOuQ,GAAiBvQ,GAzD1B,GAAIxD,GAASD,EAAMC,OA+Bf6T,GA9BM9T,EAAMG,QAiDZ6T,IAYJhU,GAAMyT,uBAAyBA,EAC/BzT,EAAM4T,oBAAsBA,EAO5B7T,OAAOD,QAAUqQ,EAKjBlQ,EAAOH,QAASE,EAOhB,IAAIiU,GAAenO,SAASoO,qBAC5B,IAAID,EACF,IAAK,GAAgChQ,GAA5BH,EAAE,EAAGC,EAAEkQ,EAAajQ,OAAcD,EAAFD,IAASG,EAAEgQ,EAAanQ,IAAKA,IACpEqM,EAAQvN,MAAM,KAAMqB,IAIvBnE,SC5FH,SAAUE,GAEV,GAAIwI,IACF2L,oBAAqB,SAAS5N,GAC5BT,SAASsO,YAAYC,WAAW9N,IAElC+N,kBAAmB,WAEjB,GAAIC,GAAYrT,KAAKoQ,aAAa,cAAgB,GAC9Cf,EAAO,GAAIiE,KAAID,EAAWrT,KAAKuT,cAAcC,QACjDxT,MAAKhB,UAAUyU,YAAc,SAASC,EAAS/F,GAC7C,GAAIgG,GAAI,GAAIL,KAAII,EAAS/F,GAAQ0B,EACjC,OAAOsE,GAAEC,OAMf9U,GAAMG,IAAImF,YAAYkD,KAAOA,GAE1B1I,SCrBH,SAAUE,GA2KR,QAAS+U,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIN,KAAIQ,EAAM1D,aAAa,QAAS2D,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASzB,GAAkBL,EAAOhT,GAChC,GAAIgT,EAAO,CACLhT,IAAUsC,WACZtC,EAAQsC,SAAS4S,MAEfnV,OAAOoT,oBACTnT,EAAQsC,SAAS4S,KAOnB,IAAIC,GAAQC,EAAmBpC,EAAME,aACjCmC,EAAOrC,EAAM1B,aAAaiB,EAC1B8C,IACFF,EAAM/L,aAAamJ,EAAuB8C,EAI5C,IAAIvE,GAAU9Q,EAAMsV,iBACpB,IAAItV,IAAUsC,SAAS4S,KAAM,CAC3B,GAAI9C,GAAW,SAAWG,EAAwB,IAC9CgD,EAAKjT,SAAS4S,KAAK/D,iBAAiBiB,EACpCmD,GAAGvR,SACL8M,EAAUyE,EAAGA,EAAGvR,OAAO,GAAGwR,oBAG9BxV,EAAM+Q,aAAaoE,EAAOrE,IAI9B,QAASsE,GAAmBlD,EAASlS,GACnCA,EAAQA,GAASsC,SACjBtC,EAAQA,EAAMuC,cAAgBvC,EAAQA,EAAMyU,aAC5C,IAAIzB,GAAQhT,EAAMuC,cAAc,QAEhC,OADAyQ,GAAME,YAAchB,EACbc,EAGT,QAASyC,GAAiBT,GACxB,MAAQA,IAASA,EAAMU,YAAe,GAGxC,QAASC,GAAgBpP,EAAMqP,GAC7B,MAAIC,GACKA,EAAQ9T,KAAKwE,EAAMqP,GAD5B,OAzNF,GACIzV,IADMJ,OAAOyH,aACPxH,EAAMG,IAAIoF,SAASkN,QACzBF,EAAwBpS,EAAIoS,sBAI5BuD,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbzD,GAEF0D,WAAY,SAASrV,GACnB,GAAIsV,GAAUlV,KAAKmV,iBACfD,IACFlV,KAAKoV,sBAAsBF,EAE7B,IAAI3D,GAASvR,KAAKqV,mBAAmBH,EACjC3D,GAAOzO,OACT8B,SAAS0Q,cAAcL,WAAW1D,EAAQ3R,GACjCA,GACTA,KAGJwV,sBAAuB,SAAS/F,GAE9B,IAAK,GAAsB0C,GAAGwD,EAD1BlB,EAAKhF,EAAKY,iBAAiB6E,GACtBlS,EAAE,EAAGC,EAAEwR,EAAGvR,OAAiBD,EAAFD,IAASmP,EAAEsC,EAAGzR,IAAKA,IACnD2S,EAAIrB,EAAmBL,EAAmB9B,EAAG/R,KAAKuT,cAAcC,SAC5DxT,KAAKuT,eACTvT,KAAKwV,oBAAoBD,EAAGxD,GAC5BA,EAAE5F,WAAWsJ,aAAaF,EAAGxD,IAGjCyD,oBAAqB,SAAS1D,EAAO4D,GACnC,IAAK,GAA0CrN,GAAtCzF,EAAE,EAAGkF,EAAG4N,EAAK9N,WAAY/E,EAAEiF,EAAGhF,QAAYuF,EAAEP,EAAGlF,KAASC,EAAFD,EAAKA,IACnD,QAAXyF,EAAE9F,MAA6B,SAAX8F,EAAE9F,MACxBuP,EAAM5J,aAAaG,EAAE9F,KAAM8F,EAAE5I,QAInC4V,mBAAoB,SAAShG,GAC3B,GAAIsG,KACJ,IAAItG,EAEF,IAAK,GAAsB0C,GADvBsC,EAAKhF,EAAKY,iBAAiB2E,GACtBhS,EAAE,EAAGC,EAAEwR,EAAGvR,OAAcD,EAAFD,IAASmP,EAAEsC,EAAGzR,IAAKA,IAC5CmP,EAAEC,YAAYtJ,MAAMmM,IACtBc,EAAUjK,KAAKqG,EAIrB,OAAO4D,IAOTC,cAAe,WACb5V,KAAK6V,cACL7V,KAAK8V,cACL9V,KAAK+V,qBACL/V,KAAKgW,uBAKPH,YAAa,WACX7V,KAAKiW,OAASjW,KAAKkW,UAAUpB,GAC7B9U,KAAKiW,OAAO7W,QAAQ,SAAS2S,GACvBA,EAAE5F,YACJ4F,EAAE5F,WAAWgK,YAAYpE,MAI/B+D,YAAa,WACX9V,KAAKuR,OAASvR,KAAKkW,UAAUtB,EAAiB,IAAMI,EAAa,KACjEhV,KAAKuR,OAAOnS,QAAQ,SAAS2S,GACvBA,EAAE5F,YACJ4F,EAAE5F,WAAWgK,YAAYpE,MAa/BgE,mBAAoB,WAClB,GAAIE,GAASjW,KAAKiW,OAAOG,OAAO,SAASrE,GACvC,OAAQA,EAAE9J,aAAa+M,KAErBE,EAAUlV,KAAKmV,iBACnB,IAAID,EAAS,CACX,GAAIlE,GAAU,EAId,IAHAiF,EAAO7W,QAAQ,SAAS0U,GACtB9C,GAAWuD,EAAiBT,GAAS,OAEnC9C,EAAS,CACX,GAAIc,GAAQoC,EAAmBlD,EAAShR,KAAKuT,cAC7C2B,GAAQrF,aAAaiC,EAAOoD,EAAQmB,eAI1CH,UAAW,SAAShF,EAAUoF,GAC5B,GAAIC,GAAQvW,KAAKiQ,iBAAiBiB,GAAUsF,QACxCtB,EAAUlV,KAAKmV,iBACnB,IAAID,EAAS,CACX,GAAIuB,GAAgBvB,EAAQjF,iBAAiBiB,GAAUsF,OACvDD,GAAQA,EAAMG,OAAOD,GAEvB,MAAOH,GAAUC,EAAMH,OAAOE,GAAWC,GAE3CpB,gBAAiB,WACf,GAAIzI,GAAW1M,KAAKuP,cAAc,WAClC,OAAO7C,IAAYyI,gBAAgBzI,IAWrCsJ,oBAAqB,WACnB,GAAIlE,GAAQ9R,KAAK2W,cAAc5B,EAC/B5C,GAAkBL,EAAO1Q,SAAS4S,OAEpCrC,gBAAiB,SAASiF,GACxB,GAAI5F,GAAU,GAEVE,EAAW,IAAM8D,EAAa,IAAM4B,EAAkB,IACtDN,EAAU,SAASvE,GACrB,MAAO0C,GAAgB1C,EAAGb,IAExB+E,EAASjW,KAAKiW,OAAOG,OAAOE,EAChCL,GAAO7W,QAAQ,SAAS0U,GACtB9C,GAAWuD,EAAiBT,GAAS,QAGvC,IAAIvC,GAASvR,KAAKuR,OAAO6E,OAAOE,EAIhC,OAHA/E,GAAOnS,QAAQ,SAAS0S,GACtBd,GAAWc,EAAME,YAAc,SAE1BhB,GAET2F,cAAe,SAASC,GACtB,GAAI5F,GAAUhR,KAAK2R,gBAAgBiF,EACnC,OAAO5W,MAAKkS,oBAAoBlB,EAAS4F,IAE3C1E,oBAAqB,SAASlB,EAAS4F,GACrC,GAAI5F,EAAS,CACX,GAAIc,GAAQoC,EAAmBlD,EAG/B,OAFAc,GAAM5J,aAAamJ,EAAuBrR,KAAKoQ,aAAa,QACxD,IAAMwG,GACH9E,KA2DTrP,EAAI1B,YAAY/B,UAChB2V,EAAUlS,EAAEkS,SAAWlS,EAAEgS,iBAAmBhS,EAAEoU,uBAC3CpU,EAAEqU,kBAIThY,GAAMG,IAAImF,YAAYmN,OAASA,EAC/BzS,EAAMqT,kBAAoBA,GAEzBvT,SCzOH,SAAUE,GAIR,GACIG,IADMJ,OAAOyH,aACPxH,EAAMG,IAAIoF,SAASmC,QACzBD,EAAetH,EAAIsH,aAGnBC,GACFuQ,gBAAiB,WAEf,GAAIC,GAAYhX,KAAKhB,UAAU0H,cAE/B1G,MAAKiX,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAAS3O,GAALzF,EAAE,EAAMyF,EAAErI,KAAK4H,WAAWhF,GAAIA,IAEjC5C,KAAKkX,eAAe7O,EAAE9F,QAExByU,EAAUhX,KAAKmX,kBAAkB9O,EAAE9F,OAAS8F,EAAE5I,MAAMwE,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAImT,SAK7BF,eAAgB,SAAU7X,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD8X,kBAAmB,SAAS9X,GAC1B,MAAOA,GAAEgY,MAAMC,KAIfA,EAAe/Q,EAAazD,MAGhChE,GAAMG,IAAImF,YAAYoC,OAASA,GAE9B5H,SC1CH,SAAUE,GAIR,GAAI8K,IACF2N,eAAgB,SAASvY,GAEvB,GAAiCuM,GAA7BhB,EAAUvL,EAAUuL,OACxB,KAAK,GAAIlL,KAAKL,GACQ,YAAhBK,EAAEgY,MAAM,MACL9M,IACHA,EAAYvL,EAAUuL,YAExBgB,EAAWlM,EAAEgY,MAAM,EAAG,IACtB9M,EAAQgB,GAAYhB,EAAQgB,IAAalM,IAI/CmY,iBAAkB,SAASxY,GAEzB,GAAIiL,GAAIjL,EAAUuL,OAClB,IAAIN,EAAG,CACL,GAAIwN,KACJ,KAAK,GAAIpY,KAAK4K,GAEZ,IAAK,GAASyN,GADVC,EAAQtY,EAAEuY,MAAM,KACXhV,EAAE,EAAO8U,EAAGC,EAAM/U,GAAIA,IAC7B6U,EAASC,GAAMzN,EAAE5K,EAGrBL,GAAUuL,QAAUkN,IAGxBI,qBAAsB,SAAS7Y,GAC7B,GAAIA,EAAUuL,QAAS,CAErB,GAAIlC,GAAIrJ,EAAU8K,gBAClB,KAAK,GAAIzK,KAAKL,GAAUuL,QAEtB,IAAK,GAASmN,GADVC,EAAQtY,EAAEuY,MAAM,KACXhV,EAAE,EAAO8U,EAAGC,EAAM/U,GAAIA,IAC7ByF,EAAEqD,KAAKgM,GAIb,GAAI1Y,EAAUsF,QAAS,CAErB,GAAI+D,GAAIrJ,EAAUgL,gBAClB,KAAK,GAAI3K,KAAKL,GAAUsF,QACtB+D,EAAEqD,KAAKrM,KAIbyY,kBAAmB,SAAS9Y,EAAW2O,GAErC,GAAIrJ,GAAUtF,EAAUsF,OACpBA,KAEFtE,KAAK+X,kBAAkBzT,EAAStF,EAAW2O,GAE3C3O,EAAUoJ,WAAapI,KAAKgY,aAAa1T,KAG7CyT,kBAAmB,SAASnO,EAAY5K,EAAW2O,GAEjD,IAAK,GAAItO,KAAKuK,GACSpE,SAAjBxG,EAAUK,IAAgCmG,SAAZmI,EAAKtO,KACrCL,EAAUK,GAAKuK,EAAWvK,KAIhC2Y,aAAc,SAASpO,GACrB,GAAIqO,KACJ,KAAK,GAAI5Y,KAAKuK,GACZqO,EAAI5Y,EAAE6Y,eAAiB7Y,CAEzB,OAAO4Y,IAMXnZ,GAAMG,IAAImF,YAAYwF,WAAaA,GAElChL,SClFH,SAAUE,GAIR,GAAIqZ,GAAuB,aACvBC,EAAmB,OAInBxQ,GACFyQ,yBAA0B,SAASrZ,GAEjCgB,KAAKsY,cAActZ,EAAW,aAE9BgB,KAAKsY,cAActZ,EAAW,wBAEhCuZ,kBAAmB,SAASvZ,EAAW2O,GAErC,GAAI/F,GAAa5H,KAAKoQ,aAAa+H,EACnC,IAAIvQ,EAMF,IAAK,GAAyBvI,GAJ1BiF,EAAUtF,EAAUsF,UAAYtF,EAAUsF,YAE1CqT,EAAQ/P,EAAWgQ,MAAMQ,GAEpBxV,EAAE,EAAGC,EAAE8U,EAAM7U,OAAaD,EAAFD,EAAKA,IAEpCvD,EAAIsY,EAAM/U,GAAGwU,OAET/X,GAAoBmG,SAAflB,EAAQjF,IAAgCmG,SAAZmI,EAAKtO,KACxCiF,EAAQjF,GAAK,OAMrBmZ,6BAA8B,WAK5B,IAAK,GAAsBnQ,GAHvBoQ,EAAWzY,KAAKhB,UAAU+I,oBAE1BD,EAAK9H,KAAK4H,WACLhF,EAAE,EAAGC,EAAEiF,EAAGhF,OAAcD,EAAFD,IAASyF,EAAEP,EAAGlF,IAAKA,IAC5C5C,KAAK0Y,oBAAoBrQ,EAAE9F,QAC7BkW,EAASpQ,EAAE9F,MAAQ8F,EAAE5I,QAI3BiZ,oBAAqB,SAASnW,GAC5B,OAAQvC,KAAK2Y,UAAUpW,IAA6B,QAApBA,EAAK8U,MAAM,EAAE,IAG/CsB,WACEpW,KAAM,EACNqW,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAKrBnR,GAAW+Q,UAAUR,GAAwB,EAI7CrZ,EAAMG,IAAImF,YAAYwD,WAAaA,GAElChJ,SCpEH,SAAUE,GA+NR,QAASka,GAAyBha,GAChC,IAAKE,OAAOwD,UAAW,CACrB,GAAIuW,GAAW/Z,OAAOiC,eAAenC,EACrCA,GAAU0D,UAAYuW,EAClBzL,EAAOyL,KACTA,EAASvW,UAAYxD,OAAOiC,eAAe8X,KAhOjD,GAAIha,GAAMH,EAAMG,IACZuO,EAAS1O,EAAM0O,OACfzO,EAASD,EAAMC,OAIfC,GAEFgC,SAAU,SAASuB,EAAM2W,GAEvBlZ,KAAKmZ,eAAe5W,EAAM2W,GAE1BlZ,KAAKwS,kBAAkBjQ,EAAM2W,GAE7BlZ,KAAKoZ,sBAGPD,eAAgB,SAAS5W,EAAM2W,GAE7B,GAAIG,GAAYva,EAAMyT,uBAAuBhQ,GAEzCoL,EAAO3N,KAAKsZ,sBAAsBJ,EAEtClZ,MAAKuZ,sBAAsBF,EAAW1L,GAEtC3N,KAAKhB,UAAYgB,KAAKwZ,gBAAgBH,EAAW1L,GAEjD3N,KAAKyZ,qBAAqBlX,EAAM2W,IAGlCK,sBAAuB,SAASva,EAAW2O,GAGzC3O,EAAUiQ,QAAUjP,KAEpBA,KAAKuY,kBAAkBvZ,EAAW2O,GAElC3N,KAAK8X,kBAAkB9Y,EAAW2O,GAElC3N,KAAKuX,eAAevY,GAEpBgB,KAAKwX,iBAAiBxY,IAGxBwa,gBAAiB,SAASxa,EAAW2O,GAEnC3N,KAAK0Z,gBAAgB1a,EAAW2O,EAEhC,IAAIgM,GAAU3Z,KAAK4Z,YAAY5a,EAAW2O,EAG1C,OADAqL,GAAyBW,GAClBA,GAGTD,gBAAiB,SAAS1a,EAAW2O,GAEnC3N,KAAKsY,cAAc,UAAWtZ,EAAW2O,GAEzC3N,KAAKsY,cAAc,UAAWtZ,EAAW2O,GAEzC3N,KAAKsY,cAAc,aAActZ,EAAW2O,GAE5C3N,KAAKsY,cAAc,sBAAuBtZ,EAAW2O,GAErD3N,KAAKsY,cAAc,iBAAkBtZ,EAAW2O,IAIlD8L,qBAAsB,SAASlX,EAAMsX,GAEnC7Z,KAAK6X,qBAAqB7X,KAAKhB,WAE/BgB,KAAK4V,gBAEL5V,KAAKiT,oBAAoBjT,MAEzBA,KAAKwY,+BAELxY,KAAK+W,kBAKL/W,KAAKoT,oBAEDvU,OAAOoT,mBACTrN,SAASuM,UAAU2I,YAAY9Z,KAAKmV,kBAAmB5S,EAAMsX,GAG3D7Z,KAAKhB,UAAU+a,kBACjB/Z,KAAKhB,UAAU+a,iBAAiB/Z,OAMpCoZ,mBAAoB,WAClB,GAAIY,GAASha,KAAKoQ,aAAa,cAC3B4J,KACFnb,OAAOmb,GAAUha,KAAKia,OAK1BX,sBAAuB,SAASY,GAC9B,GAAIlb,GAAYgB,KAAKma,kBAAkBD,EACvC,KAAKlb,EAAW,CAEd,GAAIA,GAAY+B,YAAYG,mBAAmBgZ,EAE/Clb,GAAYgB,KAAKoa,cAAcpb,GAE/Bqb,EAAcH,GAAUlb,EAE1B,MAAOA,IAGTmb,kBAAmB,SAAS5X,GAC1B,MAAO8X,GAAc9X,IAIvB6X,cAAe,SAASpb,GACtB,GAAIA,EAAU0O,YACZ,MAAO1O,EAET,IAAIsb,GAAWpb,OAAOqb,OAAOvb,EAkB7B,OAfAC,GAAIqF,QAAQrF,EAAIoF,SAAUiW,GAa1Bta,KAAKwa,YAAYF,EAAUtb,EAAWC,EAAIoF,SAASmI,IAAK,QAEjD8N,GAGTE,YAAa,SAASF,EAAUtb,EAAWC,EAAKsD,GAC9C,GAAIX,GAAS,SAAS8C,GACpB,MAAO1F,GAAUuD,GAAMb,MAAM1B,KAAM0E,GAErC4V,GAAS/X,GAAQ,WAEf,MADAvC,MAAKgN,WAAapL,EACX3C,EAAIsD,GAAMb,MAAM1B,KAAM2B,aAKjC2W,cAAe,SAAS/V,EAAMvD,EAAW2O,GAEvC,GAAI8M,GAASzb,EAAUuD,MAEvBvD,GAAUuD,GAAQvC,KAAK4Z,YAAYa,EAAQ9M,EAAKpL,KAIlDiQ,kBAAmB,SAASjQ,EAAMsX,GAChC,GAAIa,IACF1b,UAAWgB,KAAKhB,WAGd2b,EAAgB3a,KAAK4a,kBAAkBf,EACvCc,KACFD,EAAK9B,QAAU+B,GAGjB5Z,YAAYC,SAASuB,EAAMvC,KAAKhB,WAEhCgB,KAAKia,KAAO7Y,SAASyZ,gBAAgBtY,EAAMmY,IAG7CE,kBAAmB,SAASrY,GAC1B,GAAIA,GAAQA,EAAKuY,QAAQ,KAAO,EAC9B,MAAOvY,EAEP,IAAIE,GAAIzC,KAAKma,kBAAkB5X,EAC/B,OAAIE,GAAEwM,QACGjP,KAAK4a,kBAAkBnY,EAAEwM,QAAQ2J,SAD1C,SASFyB,IAIFrb,GAAU4a,YADR1a,OAAOwD,UACe,SAASqB,EAAQgX,GAIvC,MAHIhX,IAAUgX,GAAahX,IAAWgX,IACpChX,EAAOrB,UAAYqY,GAEdhX,GAGe,SAASA,EAAQgX,GACvC,GAAIhX,GAAUgX,GAAahX,IAAWgX,EAAW,CAC/C,GAAIpB,GAAUza,OAAOqb,OAAOQ,EAC5BhX,GAAShF,EAAO4a,EAAS5V,GAE3B,MAAOA,IAoBX9E,EAAImF,YAAYpF,UAAYA,GAE3BJ,SC7OH,SAAUE,GA4FR,QAASkc,GAAgB/L,GACvB,MAAO7N,UAAS6Z,SAAShM,GAAWiM,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYrY,OAASqY,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiBzb,GACxB0b,EAAMC,aAAc,EACpBC,eAAe3N,OAAQ,EACvB4N,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiB/b,GACvB0b,EAAMC,aAAc,EACpBD,EAAMM,UA9GV,GAAIN,IAEFzb,KAAM,SAASoP,EAAS2M,EAAO3b,GAM7B,MAL8B,KAA1BD,KAAK8a,QAAQ7L,KACfjP,KAAKiG,IAAIgJ,GACTA,EAAQ4M,QAAUD,EAClB3M,EAAQ6M,KAAO7b,GAEiB,IAA1BD,KAAK8a,QAAQ7L,IAEvBhJ,IAAK,SAASgJ,GAEZ+L,EAAgB/L,GAASvD,KAAKuD,IAEhC6L,QAAS,SAAS7L,GAChB,GAAIrM,GAAIoY,EAAgB/L,GAAS6L,QAAQ7L,EAKzC,OAJIrM,IAAK,GAAKxB,SAAS6Z,SAAShM,KAC9BrM,GAAM6Y,YAAYM,WAAaN,YAAY5N,MACzCsN,EAAYrY,OAAS,KAElBF,GAGT3C,GAAI,SAASgP,GACX,GAAI+M,GAAUhc,KAAKgG,OAAOiJ,EACtB+M,KACFA,EAAQF,KAAKjb,KAAKmb,GAClBA,EAAQH,QAAUG,EAAQF,KAAO,KACjC9b,KAAK4b,UAGT5V,OAAQ,SAASiJ,GACf,GAAIrM,GAAI5C,KAAK8a,QAAQ7L,EACrB,IAAU,IAANrM,EAIJ,MAAOoY,GAAgB/L,GAASgN,SAElCL,MAAO,WAEL,GAAI3M,GAAUjP,KAAKkc,aAInB,OAHIjN,IACFA,EAAQ4M,QAAQhb,KAAKoO,GAEnBjP,KAAKmc,YACPnc,KAAK6N,SACE,GAFT,QAKFqO,YAAa,WACX,MAAOd,MAETe,SAAU,WACR,OAAQnc,KAAKub,aAAevb,KAAKoc,WAEnCA,QAAS,WACP,OAAQjB,EAAYrY,SAAWoY,EAAUpY,QAE3C+K,MAAO,WAWL,GAJI2N,eAAe3N,SAAU,IAC3B2N,eAAea,oBAAoBjb,UACnCoa,eAAe3N,OAAQ,GAErByO,EAEF,IADA,GAAIla,GACGka,EAAexZ,SACpBV,EAAKka,EAAeL,YAK1BN,iBAAkB,SAAS/b,GACrBA,GACF0c,EAAe5Q,KAAK9L,IAGxB2b,aAAa,GAGXJ,KACAD,KACAoB,IAYJlb,UAASmb,iBAAiB,qBAAsB,WAC9Cf,eAAe3N,OAAQ,IAczB/O,EAAMwc,MAAQA,EACdxc,EAAMuc,iBAAmBA,GACxBzc,SCvHH,SAAUE,GAIR,QAAS0d,GAAeC,EAAmB7c,GACrC6c,GACFrb,SAAS4S,KAAKvE,YAAYgN,GAC1BpB,EAAiBzb,IACRA,GACTA,IAIJ,QAAS8c,GAAWC,EAAM/c,GACxB,GAAI+c,GAAQA,EAAK7Z,OAAQ,CAErB,IAAK,GAAwB8Z,GAAKlH,EAD9BmH,EAAOzb,SAAS0b,yBACXla,EAAE,EAAGC,EAAE8Z,EAAK7Z,OAAsBD,EAAFD,IAASga,EAAID,EAAK/Z,IAAKA,IAC9D8S,EAAOtU,SAASC,cAAc,QAC9BqU,EAAKqH,IAAM,SACXrH,EAAK9B,KAAOgJ,EACZC,EAAKpN,YAAYiG,EAEnB8G,GAAeK,EAAMjd,OACdA,IACTA,IAtBJ,GAAIyb,GAAmBvc,EAAMuc,gBA2B7Bvc,GAAMke,OAASN,EACf5d,EAAM0d,eAAiBA,GAEtB5d,SChCH,SAAUE,GAuHR,QAASme,GAAa1a,GACpB,MAAO2a,SAAQnc,YAAYG,mBAAmBqB,IAGhD,QAAS4a,GAAY5a,GACnB,MAAQA,IAAQA,EAAKuY,QAAQ,MAAQ,EAxHvC,GAAI/b,GAASD,EAAMC,OACfE,EAAMH,EAAMG,IACZqc,EAAQxc,EAAMwc,MACdD,EAAmBvc,EAAMuc,iBACzB9I,EAAyBzT,EAAMyT,uBAC/BG,EAAsB5T,EAAM4T,oBAI5B1T,EAAYD,EAAOG,OAAOqb,OAAOxZ,YAAY/B,YAE/C8O,gBAAiB,WACX9N,KAAKoQ,aAAa,SACpBpQ,KAAKod,QAITA,KAAM,WAEJpd,KAAKuC,KAAOvC,KAAKoQ,aAAa,QAC9BpQ,KAAK4Y,QAAU5Y,KAAKoQ,aAAa,WAEjCpQ,KAAKqd,gBAELrd,KAAK6S,qBAGPA,kBAAmB,WACd7S,KAAKsd,YACJtd,KAAK0S,oBAAoB1S,KAAKuC,OAC9BvC,KAAKud,mBACLvd,KAAKwd,uBAKTlC,EAAMrb,GAAGD,OAKXyd,UAAW,WAILN,EAAYnd,KAAK4Y,WAAaqE,EAAajd,KAAK4Y,UAClD3W,QAAQC,KAAK,sGACuClC,KAAKuC,KACrDvC,KAAK4Y,SAEX5Y,KAAKgB,SAAShB,KAAKuC,KAAMvC,KAAK4Y,SAC9B5Y,KAAKsd,YAAa,GAIpB5K,oBAAqB,SAASnQ,GAC5B,MAAKgQ,GAAuBhQ,GAA5B,QAEEmQ,EAAoBnQ,EAAMvC,MAE1BA,KAAK0d,eAAenb,IAEb,IAIXmb,eAAgB,SAASnb,GAEvB,GAAIvC,KAAKiI,aAAa,cAAgBjI,KAAK6Y,SAQzC,GAPA7Y,KAAK6Y,UAAW,EAOZha,OAAO2c,iBAAmBA,eAAeO,UAC3Cnd,QAAQ2D,OACH,CACL,GAAI8P,GAASjR,SAASC,cAAc,SACpCgR,GAAOL,YAAc,YAAezP,EAAO,MAC3CvC,KAAKyP,YAAY4C,KAKvBmL,oBAAqB,WACnB,MAAOxd,MAAK2d,iBAMdJ,gBAAiB,WACf,MAAOjC,GAAMzb,KAAKG,KAAMA,KAAK6S,kBAAmB7S,KAAKyd,YAGvDJ,cAAe,WACbrd,KAAK2d,iBAAkB,EACvB3d,KAAKiV,WAAW,WACdjV,KAAK2d,iBAAkB,EACvB3d,KAAK6S,qBACLvS,KAAKN,SASXf,GAAIqF,QAAQrF,EAAImF,YAAapF,GAc7BF,EAAMyT,uBAAyBA,EAI/B8I,EAAiB,WACfja,SAASwc,KAAK7U,gBAAgB,cAC9B3H,SAASqE,cACP,GAAIF,aAAY,iBAAkBJ,SAAS,OAM/C/D,SAASyZ,gBAAgB,mBAAoB7b,UAAWA,KAEvDJ","sourcesContent":["/*\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 */\nPolymer = {};\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// 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 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  // 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 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  // 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 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  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","/*\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    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\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  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 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  // 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 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  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 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\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      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\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 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\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 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  // 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    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        // keep track of property observer so we can shut it down\n        this.registerObservers([o]);\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.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        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\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) {\n      // apply Polymer two-way reference binding\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.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\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        var keys=Object.keys(this._namedObservers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._namedObservers[k];\n          o.close();\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(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\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  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\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(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      var dom = template.createInstance(this, 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);\n        this.reflectPropertyToAttribute(property);\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) {\n          observer.path = observable.path_;\n          this.bindings_ = this.bindings_ || {};\n          this.bindings_[name] = observer;\n        }\n        return observer;\n      }\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 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  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    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // storage for closeable observers.\n      this._observers = [];\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\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    },\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 a lightDOMController 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.lightDomController = true;\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 pointer gestures\n      PointerGestures.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 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  // 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 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  // 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 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 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 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  // 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 content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else 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    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\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 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\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 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  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);","/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // element api\r\n\r\n  var properties = {\r\n    inferObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var observe = prototype.observe, property;\r\n      for (var n in prototype) {\r\n        if (n.slice(-7) === 'Changed') {\r\n          if (!observe) {\r\n            observe  = (prototype.observe = {});\r\n          }\r\n          property = n.slice(0, -7)\r\n          observe[property] = observe[property] || n;\r\n        }\r\n      }\r\n    },\r\n    explodeObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var o = prototype.observe;\r\n      if (o) {\r\n        var exploded = {};\r\n        for (var n in o) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            exploded[ni] = o[n];\r\n          }\r\n        }\r\n        prototype.observe = exploded;\r\n      }\r\n    },\r\n    optimizePropertyMaps: function(prototype) {\r\n      if (prototype.observe) {\r\n        // construct name list\r\n        var a = prototype._observeNames = [];\r\n        for (var n in prototype.observe) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            a.push(ni);\r\n          }\r\n        }\r\n      }\r\n      if (prototype.publish) {\r\n        // construct name list\r\n        var a = prototype._publishNames = [];\r\n        for (var n in prototype.publish) {\r\n          a.push(n);\r\n        }\r\n      }\r\n    },\r\n    publishProperties: function(prototype, base) {\r\n      // if we have any properties to publish\r\n      var publish = prototype.publish;\r\n      if (publish) {\r\n        // transcribe `publish` entries onto own prototype\r\n        this.requireProperties(publish, prototype, base);\r\n        // construct map of lower-cased property names\r\n        prototype._publishLC = this.lowerCaseMap(publish);\r\n      }\r\n    },\r\n    requireProperties: function(properties, prototype, base) {\r\n      // ensure a prototype value for each property\r\n      for (var n in properties) {\r\n        if (prototype[n] === undefined && base[n] === undefined) {\r\n          prototype[n] = properties[n];\r\n        }\r\n      }\r\n    },\r\n    lowerCaseMap: function(properties) {\r\n      var map = {};\r\n      for (var n in properties) {\r\n        map[n.toLowerCase()] = n;\r\n      }\r\n      return map;\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.declaration.properties = properties;\r\n\r\n})(Polymer);\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(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    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    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            publish[n] = null;\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    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\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  // 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 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  // 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 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      // 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 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  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\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        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\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    ready: function() {\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      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\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 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  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 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  // 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  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\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"]}
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 0417bcb..fb28836 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -55,15 +55,6 @@
   _hookJsPolymer();
   _deployMode = deployMode;
 
-  if (initializers == null) {
-    throw '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.';
-  }
-
-  Polymer.registerSync('d-auto-binding', AutoBindingElement,
-      extendsTag: 'template');
-
   for (var initializer in initializers) {
     initializer();
   }
@@ -101,7 +92,7 @@
   var zone = Zone.current;
 
   polymerJs.callMethod('whenPolymerReady',
-      [zone.bindCallback(() => Polymer._onReady.complete())]);
+      [zone.bindCallback(() => Polymer._ready.complete())]);
 
   var polyElem = document.createElement('polymer-element');
   var proto = new JsObject.fromBrowserObject(polyElem)['__proto__'];
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 42992b0..a0a7820 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.11.0-dev
+version: 0.10.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -7,11 +7,11 @@
   browsers.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: '>=0.15.6 <0.16.0'
+  analyzer: '>=0.13.0 <0.14.0'
   args: '>=0.10.0 <0.12.0'
   barback: '>=0.9.0 <0.15.0'
   browser: '>=0.10.0 <0.11.0'
-  code_transformers: '>=0.1.4 <0.2.0'
+  code_transformers: '>=0.1.0 <0.2.0'
   html5lib: '>=0.11.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   observe: '>=0.10.0 <0.11.0'
@@ -19,7 +19,7 @@
   polymer_expressions: '>=0.10.0 <0.11.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'
+  template_binding: '>=0.10.0 <0.11.0'
   web_components: '>=0.3.3 <0.4.0'
   yaml: '>=0.9.0 <2.0.0'
 dev_dependencies:
@@ -31,4 +31,4 @@
     files: lib/src/instance.dart
     $include: lib/src/instance.dart
 environment:
-  sdk: '>=1.4.0 <2.0.0'
+  sdk: '>=1.3.0-dev.5.0 <2.0.0'
diff --git a/pkg/polymer/test/bind_mdv_test.dart b/pkg/polymer/test/bind_mdv_test.dart
index 008c6d8..d30bc66 100644
--- a/pkg/polymer/test/bind_mdv_test.dart
+++ b/pkg/polymer/test/bind_mdv_test.dart
@@ -17,7 +17,7 @@
   useHtmlConfiguration();
 
   var registered = customElementsReady.then((_) {
-    document.registerElement('my-div', MyDivElement);
+    document.register('my-div', MyDivElement);
   });
 
   setUp(() => registered);
diff --git a/pkg/polymer/test/build/code_extractor.dart b/pkg/polymer/test/build/code_extractor.dart
index f14b235..d9ffad2 100644
--- a/pkg/polymer/test/build/code_extractor.dart
+++ b/pkg/polymer/test/build/code_extractor.dart
@@ -87,9 +87,9 @@
           "web/test.html.1.dart", "web/test.html.2.dart",
           "web/test.html.3.dart"]),
       'a|web/test.html.0.dart': 'library a.web.test2_html_0;\nmain1() { }',
-      'a|web/test.html.1.dart': 'library a.web.bar.test_html_0;\nmain2() { }',
-      'a|web/test.html.2.dart': 'library a.foo.test_html_0;\nmain3() { }',
-      'a|web/test.html.3.dart': 'library b.test_html_0;\nmain4() { }'
+      'a|web/test.html.1.dart': 'library a.web.bar.test_html_1;\nmain2() { }',
+      'a|web/test.html.2.dart': 'library a.foo.test_html_2;\nmain3() { }',
+      'a|web/test.html.3.dart': 'library b.test_html_3;\nmain4() { }'
     });
 
   testPhases('experimental bootstrap', phases, {
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 663e353..ec2be6a 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -147,7 +147,7 @@
           '</body></html>',
       'a|web/test.html._data': expectedData([
           'web/test.html.1.dart','web/test.html.0.dart']),
-      'a|web/test.html.1.dart': 'library a.web.test2_html_0;\n/*forth*/',
+      'a|web/test.html.1.dart': 'library a.web.test2_html_1;\n/*forth*/',
       'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*fifth*/',
       'a|web/test2.html':
           '<!DOCTYPE html><html><head></head><body><script>/*third*/</script>'
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 48952bb..7b57ed8 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -667,6 +667,7 @@
           '<something-else my-attribute="{{here.too}}"></something-else>'
           '<div on-click="{{methodName}}"></div>'
           '<div on-click="{{ methodName2 }}"></div>' // extra space is OK
+          '<div on-click="{{@read.method}}"></div>'
           // empty handlers are invalid, but we still produce valid output.
           '<div on-click="{{}}"></div>'
           '<div on-click="{{ }}"></div>'
@@ -696,9 +697,11 @@
                   #here: (o) => o.here,
                   #iS: (o) => o.iS,
                   #intToStringTransformer: (o) => o.intToStringTransformer,
+                  #method: (o) => o.method,
                   #methodName: (o) => o.methodName,
                   #methodName2: (o) => o.methodName2,
                   #node: (o) => o.node,
+                  #read: (o) => o.read,
                   #too: (o) => o.too,
                   #twoWay: (o) => o.twoWay,
                   #twoWayInt: (o) => o.twoWayInt,
@@ -720,9 +723,11 @@
                   #here: r'here',
                   #iS: r'iS',
                   #intToStringTransformer: r'intToStringTransformer',
+                  #method: r'method',
                   #methodName: r'methodName',
                   #methodName2: r'methodName2',
                   #node: r'node',
+                  #read: r'read',
                   #too: r'too',
                   #twoWay: r'twoWay',
                   #twoWayInt: r'twoWayInt',
diff --git a/pkg/polymer/test/custom_event_test.dart b/pkg/polymer/test/custom_event_test.dart
index 3a78958..04679a9 100644
--- a/pkg/polymer/test/custom_event_test.dart
+++ b/pkg/polymer/test/custom_event_test.dart
@@ -7,8 +7,7 @@
 import 'dart:async';
 import 'dart:html';
 import 'package:polymer/polymer.dart';
-import 'package:template_binding/template_binding.dart'
-    show nodeBind, enableBindingsReflection;
+import 'package:template_binding/template_binding.dart' show nodeBind;
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 
@@ -36,40 +35,35 @@
 class TestCustomEvent extends PolymerElement {
   TestCustomEvent.created() : super.created();
 
-  get fooBar => shadowRoots['test-custom-event'].querySelector('foo-bar');
+  get fooBar => getShadowRoot('test-custom-event').querySelector('foo-bar');
 
   final events = [];
   fooHandler(e) => events.add(['foo', e]);
   barBazHandler(e) => events.add(['barbaz', e]);
 }
 
-main() {
-  enableBindingsReflection = true;
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
 
-  initPolymer().run(() {
-    useHtmlConfiguration();
+  setUp(() => Polymer.onReady);
 
-    setUp(() => Polymer.onReady);
+  test('custom event', () {
+    final testComp = querySelector('test-custom-event');
+    final fooBar = testComp.fooBar;
 
-    test('custom event', () {
-      final testComp = querySelector('test-custom-event');
-      final fooBar = testComp.fooBar;
+    final binding = nodeBind(fooBar).bindings['on-barbaz'];
+    expect(binding is Bindable, true,
+        reason: 'on-barbaz event should be bound');
 
-      final binding = nodeBind(fooBar).bindings['on-barbaz'];
-      expect(binding is Bindable, true,
-          reason: 'on-barbaz event should be bound');
+    expect(binding.value, null, reason: 'event bindings do not have value');
 
-      expect(binding.value, '{{ barBazHandler }}',
-          reason: 'event bindings use the string as value');
+    fooBar.fireFoo(123);
+    fooBar.fireBarBaz(42);
+    fooBar.fireFoo(777);
 
-      fooBar.fireFoo(123);
-      fooBar.fireBarBaz(42);
-      fooBar.fireFoo(777);
-
-      final events = testComp.events;
-      expect(events.length, 3);
-      expect(events.map((e) => e[0]), ['foo', 'barbaz', 'foo']);
-      expect(events.map((e) => e[1].detail), [123, 42, 777]);
-    });
+    final events = testComp.events;
+    expect(events.length, 3);
+    expect(events.map((e) => e[0]), ['foo', 'barbaz', 'foo']);
+    expect(events.map((e) => e[1].detail), [123, 42, 777]);
   });
-}
+});
diff --git a/pkg/polymer/test/entered_view_test.dart b/pkg/polymer/test/entered_view_test.dart
index 1b011ec..648a487 100644
--- a/pkg/polymer/test/entered_view_test.dart
+++ b/pkg/polymer/test/entered_view_test.dart
@@ -23,9 +23,9 @@
 
   XInner.created() : super.created();
 
-  attached() {
+  enteredView() {
     enteredCount++;
-    super.attached();
+    super.enteredView();
   }
 }
 
@@ -44,7 +44,7 @@
       // it goes before we do.
       return new Future(() {
         XInner inner = outer.shadowRoot.querySelector('x-inner');
-        expect(inner.enteredCount, 1, reason: 'attached should be called');
+        expect(inner.enteredCount, 1, reason: 'enteredView should be called');
       });
     });
   });
diff --git a/pkg/polymer/test/entered_view_test.html b/pkg/polymer/test/entered_view_test.html
index cb7900e..d9e937d 100644
--- a/pkg/polymer/test/entered_view_test.html
+++ b/pkg/polymer/test/entered_view_test.html
@@ -7,13 +7,13 @@
 <html>
   <!--polymer-test: this comment is needed for test_suite.dart-->
   <head>
-    <title>attached binding test</title>
+    <title>enteredView binding test</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
     This tests that elements inside the shadowRoot are properly upgraded and
-    attached is called on them. Essentially this is a Shadow DOM and Custom
+    enteredView is called on them. Essentially this is a Shadow DOM and Custom
     Elements integration test.
     <br>
 
diff --git a/pkg/polymer/test/event_handlers_test.dart b/pkg/polymer/test/event_handlers_test.dart
index 40b7a53..203ea4e 100644
--- a/pkg/polymer/test/event_handlers_test.dart
+++ b/pkg/polymer/test/event_handlers_test.dart
@@ -23,14 +23,6 @@
 
   XTest.created() : super.created();
 
-  @override
-  parseDeclaration(elementElement) {
-    var template = fetchTemplate(elementElement);
-    if (template != null) {
-      lightFromTemplate(template);
-    }
-  }
-
   ready() {
     super.ready();
     for (var i = 0; i < 10; i++) {
@@ -64,31 +56,31 @@
   }
 
   Future _runTests() {
-    fire('tap', onNode: $['div']);
+    fire('tap', toNode: $['div']);
     expect(_testCount, 2, reason: 'event heard at div and host');
     expect(_lastEvent, 'tap', reason: 'tap handled');
-    fire('focus', onNode: $['input'], canBubble: false);
+    fire('focus', toNode: $['input'], canBubble: false);
     expect(_testCount, 3, reason: 'event heard by input');
     expect(_lastEvent, 'focus', reason: 'focus handled');
-    fire('blur', onNode: $['input'], canBubble: false);
+    fire('blur', toNode: $['input'], canBubble: false);
     expect(_testCount, 4, reason: 'event heard by input');
     expect(_lastEvent, 'blur', reason: 'blur handled');
-    fire('scroll', onNode: $['list'], canBubble: false);
+    fire('scroll', toNode: $['list'], canBubble: false);
     expect(_testCount, 5, reason: 'event heard by list');
     expect(_lastEvent, 'scroll', reason: 'scroll handled');
 
     return onMutation($['list']).then((_) {
       var l1 = $['list'].querySelectorAll('.list1')[4];
-      fire('tap', onNode: l1, canBubble: false);
+      fire('tap', toNode: l1, canBubble: false);
       expect(_testCount, 6, reason: 'event heard by list1 item');
       expect(_lastEvent, 'tap', reason: 'tap handled');
       expect(_lastMessage, 'x-test callback <mini-model 4>');
 
       var l2 = $['list'].querySelectorAll('.list2')[3];
-      fire('tap', onNode: l2, canBubble: false);
+      fire('tap', toNode: l2, canBubble: false);
       expect(_testCount, 7, reason: 'event heard by list2 item');
       expect(_lastEvent, 'tap', reason: 'tap handled by model');
-      expect(_lastMessage, 'x-test callback x-test');
+      expect(_lastMessage, 'mini-model callback <mini-model 3>');
     });
   }
 }
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index 54bfa16..94dc475 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -23,8 +23,10 @@
   <polymer-element name="x-test" on-tap="{{hostTapAction}}">
     <template>
       <style>
-        :host {
-          display: block;
+        @host {
+          * {
+            display: block;
+          }
         }
         .gradient {
           background: -webkit-gradient(linear, left top, left bottom,
@@ -43,10 +45,11 @@
            on-scroll="{{scrollAction}}">
         <div class="gradient">
           <template repeat="{{list1}}">
-            <div class="list1" on-tap="{{itemTapAction}}">{{index}}</div>
+            <div class="list1" on-tap="{{itemTapAction}}">a {{index}}</div>
           </template>
           <template repeat="{{item in list2}}">
-            <div class="list2" on-tap="{{itemTapAction}}">{{item.index}}</div>
+            <div class="list2"
+                on-tap="{{@item.itemTapAction}}">b {{item.index}}</div>
           </template>
         </div>
       </div>
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index d90fd5a..dab9c5c 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -13,13 +13,11 @@
   </head>
   <body>
 
-  <polymer-element name="js-element">
+  <polymer-element name="js-element" attributes="baz">
     <template>FOOBAR</template>
     <script>
     Polymer('js-element', {
-      publish: {
-        baz: {value: 42, reflect: true}
-      },
+      baz: 42,
       aJsMethod: function(inc) {
         this.shadowRoot.textContent = this.baz + inc;
       },
diff --git a/pkg/polymer/test/mirror_loader_test.dart b/pkg/polymer/test/mirror_loader_test.dart
index b8de095..dd34fe5 100644
--- a/pkg/polymer/test/mirror_loader_test.dart
+++ b/pkg/polymer/test/mirror_loader_test.dart
@@ -10,7 +10,6 @@
 import 'package:unittest/html_config.dart';
 
 import 'package:polymer/src/mirror_loader.dart';
-/// prevent unused import warnings: [m1.XA] [m2.XA] [m3.XB] [m4.XA].
 import 'mirror_loader_1.dart' as m1;
 import 'mirror_loader_2.dart' as m2;
 import 'mirror_loader_3.dart' as m3;
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.dart b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
index 6e891d3..29caabd 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
@@ -9,8 +9,8 @@
 
 @CustomTag('my-child-element')
 class MyChildElement extends PolymerElement {
-  @PublishedProperty(reflect: true) int camelCase;
-  @PublishedProperty(reflect: true) int lowercase;
+  @published int camelCase;
+  @published int lowercase;
 
   // TODO(sigmund): remove once codegen in polymer is turned on.
   @reflectable get attributes => super.attributes;
@@ -19,8 +19,7 @@
 
   // Make this a no-op, so we can verify the initial
   // reflectPropertyToAttribute works.
-  @override
-  openPropertyObserver() { }
+  observeAttributeProperty(name) { }
 }
 
 @CustomTag('my-element')
@@ -41,7 +40,7 @@
     expect(child.lowercase, 11);
     expect(child.camelCase, 11);
 
-    expect(child.attributes['lowercase'], '11');
-    expect(child.attributes['camelcase'], '11');
+    expect('11', child.attributes['lowercase']);
+    expect('11', child.attributes['camelcase']);
   });
 });
diff --git a/pkg/polymer/test/prop_attr_reflection_test.dart b/pkg/polymer/test/prop_attr_reflection_test.dart
index ffae840..f2901c4 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_reflection_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -11,36 +11,23 @@
 class XFoo extends PolymerElement {
   XFoo.created() : super.created();
 
-  @PublishedProperty(reflect: true) var foo = '';
-  @PublishedProperty(reflect: true) String baz = '';
-
-  @PublishedProperty(reflect: true) var def1, def2;
+  @published var foo = '';
+  @published String baz = '';
 }
 
 class XBar extends XFoo {
   XBar.created() : super.created();
 
-  @PublishedProperty(reflect: true) int zot = 3;
-  @PublishedProperty(reflect: true) bool zim = false;
-  @PublishedProperty(reflect: true) String str = 'str';
-  @PublishedProperty(reflect: true) Object obj;
-}
-
-class XZot extends XBar {
-  // Dart note: trying to make this roughly equivalent to the JS
-  @PublishedProperty(reflect: false) int get zot => super.zot;
-  @PublishedProperty(reflect: false) set zot(int x) { super.zot = x; }
-
-  XZot.created() : super.created() {
-    zot = 2;
-    str = 'str2';
-  }
+  @published int zot = 3;
+  @published bool zim = false;
+  @published String str = 'str';
+  @published Object obj;
 }
 
 class XCompose extends PolymerElement {
   XCompose.created() : super.created();
 
-  @observable bool zim = false;
+  @published bool zim = false;
 }
 
 Future onAttributeChange(Element node) {
@@ -61,30 +48,17 @@
   // Most tests use @CustomTag, here we test out the impertive register:
   Polymer.register('x-foo', XFoo);
   Polymer.register('x-bar', XBar);
-  Polymer.register('x-zot', XZot);
   Polymer.register('x-compose', XCompose);
 
-  test('property to attribute reflection', () {
+  test('property attribute reflection', () {
     var xcompose = querySelector('x-compose');
     var xfoo = querySelector('x-foo');
     var xbar = querySelector('x-bar');
-    var xzot = querySelector('x-zot');
     xfoo.foo = 5;
-    xfoo.attributes['def1'] = '15';
-    xfoo.def2 = 15;
-
-    // Dart note: our test here is more async than JS until we change
-    // Polymer.dart bindings to work like observe.js "bindToInstance".
     return onAttributeChange(xfoo).then((_) {
       expect(xcompose.$['bar'].attributes.containsKey('zim'), false,
           reason: 'attribute bound to property updates when binding is made');
 
-      expect(xfoo.attributes['def2'], '15',
-          reason: 'default valued published property reflects to attr');
-
-      expect(xfoo.def1, 15,
-          reason: 'attr updates default valued published property');
-
       expect('${xfoo.foo}', xfoo.attributes['foo'],
           reason: 'attribute reflects property as string');
       xfoo.attributes['foo'] = '27';
@@ -139,17 +113,6 @@
     }).then((_) => onAttributeChange(xbar)).then((_) {
       expect(xbar.attributes['obj'], 'hi', reason:
           'reflect property based on current type');
-
-      expect(xzot.str, 'str2');
-      expect(xzot.zot, 2);
-      xzot.str = 'hello';
-      xzot.zot = 5;
-    }).then((_) => onAttributeChange(xzot)).then((_) {
-      expect(xzot.attributes['str'], xzot.str);
-      // TODO(jmesserly): the JS test seems backwards of the description text.
-      // Is it because it doesn't do "Platform.flush()"?
-      expect(xzot.attributes['zot'], '5',
-          reason: 'extendee reflect false not honored');
     });
   });
 });
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index d3d9d8b..12e2f93 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -7,20 +7,19 @@
 <html>
   <head>
   <!--polymer-test: this comment is needed for test_suite.dart-->
-    <title>property to attribute reflection</title>
+    <title>publish attributes</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
 
     <x-foo></x-foo>
-    <polymer-element name="x-foo"></polymer-element>
+    <polymer-element name="x-foo" attributes="foo baz">
+    </polymer-element>
 
     <x-bar></x-bar>
-    <polymer-element name="x-bar" extends="x-foo"></polymer-element>
-
-    <x-zot></x-zot>
-    <polymer-element name="x-zot" extends="x-bar"></polymer-element>
+    <polymer-element name="x-bar" extends="x-foo" attributes="zot zim str obj">
+    </polymer-element>
 
     <x-compose></x-compose>
     <polymer-element name="x-compose">
diff --git a/pkg/polymer/test/publish_attributes_test.dart b/pkg/polymer/test/publish_attributes_test.dart
index e31199c..241f53a 100644
--- a/pkg/polymer/test/publish_attributes_test.dart
+++ b/pkg/polymer/test/publish_attributes_test.dart
@@ -59,7 +59,7 @@
 
   test('published properties', () {
     published(tag) => (new Element.tag(tag) as PolymerElement)
-        .element.publishedProperties;
+        .declaration.publishedProperties;
 
     expect(published('x-foo'), ['Foo', 'baz']);
     expect(published('x-bar'), ['Foo', 'baz', 'Bar']);
diff --git a/pkg/polymer/test/publish_inherited_properties_test.dart b/pkg/polymer/test/publish_inherited_properties_test.dart
index e900243..dacd828 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.dart
+++ b/pkg/polymer/test/publish_inherited_properties_test.dart
@@ -55,7 +55,7 @@
 
   test('published properties', () {
     published(tag) => (new Element.tag(tag) as PolymerElement)
-        .element.publishedProperties;
+        .declaration.publishedProperties;
 
     expect(published('x-zot'), ['Foo', 'Bar', 'zot', 'm']);
     expect(published('x-squid'), ['Foo', 'Bar', 'zot', 'm', 'baz', 'squid']);
diff --git a/pkg/polymer/test/register_test.dart b/pkg/polymer/test/register_test.dart
index 0399853..d2194d5 100644
--- a/pkg/polymer/test/register_test.dart
+++ b/pkg/polymer/test/register_test.dart
@@ -19,9 +19,7 @@
 
 @CustomTag('x-div')
 class XDivElement extends DivElement with Polymer, Observable {
-  XDivElement.created() : super.created() {
-    polymerCreated();
-  }
+  XDivElement.created() : super.created();
 }
 
 @CustomTag('x-div-two')
@@ -38,9 +36,7 @@
 /// Dart-specific test:
 /// This element is registered from code without an associated polymer-element.
 class XButtonElement extends ButtonElement with Polymer, Observable {
-  XButtonElement.created() : super.created() {
-    polymerCreated();
-  }
+  XButtonElement.created() : super.created();
 }
 
 
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.dart b/pkg/polymer/test/template_distribute_dynamic_test.dart
index d808419d..6438906 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.dart
+++ b/pkg/polymer/test/template_distribute_dynamic_test.dart
@@ -12,16 +12,16 @@
 class XTest extends PolymerElement {
   @observable List list;
 
-  final _attached = new Completer();
+  final _enteredView = new Completer();
   Future onTestDone;
 
   XTest.created() : super.created() {
-    onTestDone = _attached.future.then(_runTest);
+    onTestDone = _enteredView.future.then(_runTest);
   }
 
-  attached() {
-    super.attached();
-    _attached.complete();
+  enteredView() {
+    super.enteredView();
+    _enteredView.complete();
   }
 
   _runTest(_) {
diff --git a/pkg/polymer_expressions/CHANGELOG.md b/pkg/polymer_expressions/CHANGELOG.md
index e4d51c1a..451cd00 100644
--- a/pkg/polymer_expressions/CHANGELOG.md
+++ b/pkg/polymer_expressions/CHANGELOG.md
@@ -3,28 +3,6 @@
 This file contains highlights of what changes on each version of the
 polymer_expressions package.
 
-#### Pub version 0.11.0
-  * Scopes created by templates are created less often and nested properly. The
-    previous version had a bug with respect to the names visible in 
-    <template releat> tags without an "in" expression, and <template bind> tags.
-    In those templates, names for the outer templates should not be visible.
-    This may result in some breakages in templates that relied on the buggy
-    behavior.
-  * <template bind> now supports "as" expressions.
-  * Removed warnings when attempting to assign a value to a property on null
-    object, or assign a value to a non-assignable expression. Polymer binding
-    initialization sometimes assigns to expressions, so this should reduce
-    unecessary warnings.
-  * Added the % (modulo), === (identical) and !== (not identical) operators.
-  * Fast-path for eval(). eval() no longer observes expressions or creates a
-    tree of observers.
-  * PolymerExpressions bindings clean up expression observers when closed,
-    fixing a potential memory leak.
-  * Better parse errors. Unknown operators are reported, and all exceptions are
-    instances of ParseException so that they can be caught independently of
-    exceptions generated by calling user code.
-
-
 #### Pub version 0.10.0
   * package:polymer_expressions no longer declares @MirrosUsed. The package uses
     mirrors at development time, but assumes frameworks like polymer will
diff --git a/pkg/polymer_expressions/lib/eval.dart b/pkg/polymer_expressions/lib/eval.dart
index 1594121..625bca2 100644
--- a/pkg/polymer_expressions/lib/eval.dart
+++ b/pkg/polymer_expressions/lib/eval.dart
@@ -16,22 +16,20 @@
 import 'visitor.dart';
 
 final _BINARY_OPERATORS = {
-  '+':   (a, b) => a + b,
-  '-':   (a, b) => a - b,
-  '*':   (a, b) => a * b,
-  '/':   (a, b) => a / b,
-  '%':   (a, b) => a % b,
-  '==':  (a, b) => a == b,
-  '!=':  (a, b) => a != b,
-  '===': (a, b) => identical(a, b),
-  '!==': (a, b) => !identical(a, b),
-  '>':   (a, b) => a > b,
-  '>=':  (a, b) => a >= b,
-  '<':   (a, b) => a < b,
-  '<=':  (a, b) => a <= b,
-  '||':  (a, b) => a || b,
-  '&&':  (a, b) => a && b,
-  '|':   (a, f) {
+  '+':  (a, b) => a + b,
+  '-':  (a, b) => a - b,
+  '*':  (a, b) => a * b,
+  '/':  (a, b) => a / b,
+  '%':  (a, b) => a % b,
+  '==': (a, b) => a == b,
+  '!=': (a, b) => a != b,
+  '>':  (a, b) => a > b,
+  '>=': (a, b) => a >= b,
+  '<':  (a, b) => a < b,
+  '<=': (a, b) => a <= b,
+  '||': (a, b) => a || b,
+  '&&': (a, b) => a && b,
+  '|':  (a, f) {
     if (f is Transformer) return f.forward(a);
     if (f is Filter) return f(a);
     throw new EvalException("Filters must be a one-argument function.");
@@ -49,7 +47,11 @@
 /**
  * Evaluation [expr] in the context of [scope].
  */
-Object eval(Expression expr, Scope scope) => new EvalVisitor(scope).visit(expr);
+Object eval(Expression expr, Scope scope) {
+  var observer = observe(expr, scope);
+  new Updater(scope).visit(observer);
+  return observer._value;
+}
 
 /**
  * Returns an [ExpressionObserver] that evaluates [expr] in the context of
@@ -150,6 +152,9 @@
  * and then finally looks up the name as a property in the model.
  */
 abstract class Scope implements Indexable<String, Object> {
+  static int __seq = 1;
+  final int _seq = __seq++;
+
   Scope._();
 
   /** Create a scope containing a [model] and all of [variables]. */
@@ -183,6 +188,9 @@
   /** Create a new scope extending this scope with an additional variable. */
   Scope childScope(String name, Object value) =>
       new _LocalVariableScope(name, value, this);
+
+  String toString() => 'Scope(seq: $_seq model: $model)';
+
 }
 
 /**
@@ -299,15 +307,12 @@
     }
   }
 
-  _unobserve() {
+  _observe(Scope scope) {
+    // unobserve last value
     if (_subscription != null) {
       _subscription.cancel();
       _subscription = null;
     }
-  }
-
-  _observe(Scope scope) {
-    _unobserve();
 
     var _oldValue = _value;
 
@@ -332,110 +337,6 @@
   }
 }
 
-class Closer extends RecursiveVisitor {
-  static final _instance = new Closer._();
-  factory Closer() => _instance;
-  Closer._();
-
-  visitExpression(ExpressionObserver e) {
-    e._unobserve();
-  }
-}
-
-class EvalVisitor extends Visitor {
-  final Scope scope;
-
-  EvalVisitor(this.scope);
-
-  visitEmptyExpression(EmptyExpression e) => scope.model;
-
-  visitParenthesizedExpression(ParenthesizedExpression e) => visit(e.child);
-
-  visitGetter(Getter g) {
-    var receiver = visit(g.receiver);
-    if (receiver == null) return null;
-    var symbol = smoke.nameToSymbol(g.name);
-    return smoke.read(receiver, symbol);
-  }
-
-  visitIndex(Index i) {
-    var receiver = visit(i.receiver);
-    if (receiver == null) return null;
-    var key = visit(i.argument);
-    return receiver[key];
-  }
-
-  visitInvoke(Invoke i) {
-    var receiver = visit(i.receiver);
-    if (receiver == null) return null;
-    var args = (i.arguments == null)
-        ? null
-        : i.arguments.map(visit).toList(growable: false);
-
-    if (i.method == null) {
-      assert(receiver is Function);
-      return Function.apply(receiver, args);
-    }
-
-    var symbol = smoke.nameToSymbol(i.method);
-    return smoke.invoke(receiver, symbol, args);
-  }
-
-  visitLiteral(Literal l) => l.value;
-
-  visitListLiteral(ListLiteral l) => l.items.map(visit).toList();
-
-  visitMapLiteral(MapLiteral l) {
-    var map = {};
-    for (var entry in l.entries) {
-      var key = visit(entry.key);
-      var value = visit(entry.entryValue);
-      map[key] = value;
-    }
-    return map;
-  }
-
-  visitMapLiteralEntry(MapLiteralEntry e) =>
-      throw new UnsupportedError("should never be called");
-
-  visitIdentifier(Identifier i) => scope[i.value];
-
-  visitBinaryOperator(BinaryOperator o) {
-    var operator = o.operator;
-    var left = visit(o.left);
-    var right = visit(o.right);
-
-    var f = _BINARY_OPERATORS[operator];
-    if (operator == '&&' || operator == '||') {
-      // TODO: short-circuit
-      return f(_toBool(left), _toBool(right));
-    } else if (operator == '==' || operator == '!=') {
-      return f(left, right);
-    } else if (left == null || right == null) {
-      return null;
-    }
-    return f(left, right);
-  }
-
-  visitUnaryOperator(UnaryOperator o) {
-    var expr = visit(o.child);
-    var f = _UNARY_OPERATORS[o.operator];
-    if (o.operator == '!') {
-      return f(_toBool(expr));
-    }
-    return (expr == null) ? null : f(expr);
-  }
-
-  visitTernaryOperator(TernaryOperator o) =>
-      visit(o.condition) == true ? visit(o.trueExpr) : visit(o.falseExpr);
-
-  visitInExpression(InExpression i) =>
-      throw new UnsupportedError("can't eval an 'in' expression");
-
-  visitAsExpression(AsExpression i) =>
-      throw new UnsupportedError("can't eval an 'as' expression");
-}
-
 class ObserverBuilder extends Visitor {
   final Queue parents = new Queue();
 
@@ -569,7 +470,7 @@
   ListLiteralObserver(ListLiteral value, this.items) : super(value);
 
   _updateSelf(Scope scope) {
-    _value = items.map((i) => i._value).toList();
+    _value = items.map((i) => i._value).toList(growable: false);
   }
 
   accept(Visitor v) => v.visitListLiteral(this);
diff --git a/pkg/polymer_expressions/lib/parser.dart b/pkg/polymer_expressions/lib/parser.dart
index 7ab9b4c..4d0de87 100644
--- a/pkg/polymer_expressions/lib/parser.dart
+++ b/pkg/polymer_expressions/lib/parser.dart
@@ -5,12 +5,9 @@
 library polymer_expressions.parser;
 
 import 'tokenizer.dart';
-export 'tokenizer.dart' show ParseException;
 import 'expression.dart';
 
-const _UNARY_OPERATORS = const <String>['+', '-', '!'];
-const _BINARY_OPERATORS = const <String>['+', '-', '*', '/', '%', '^', '==',
-    '!=', '>', '<', '>=', '<=', '||', '&&', '&', '===', '!==', '|'];
+const _UNARY_OPERATORS = const ['+', '-', '!'];
 
 Expression parse(String expr) => new Parser(expr).parse();
 
@@ -99,9 +96,6 @@
 
   Expression _parseBinary(left) {
     var op = _token;
-    if (!_BINARY_OPERATORS.contains(op.value)) {
-      throw new ParseException("unknown operator: ${op.value}");
-    }
     _advance();
     var right = _parseUnary();
     while (_token != null
@@ -131,8 +125,6 @@
         _advance();
         var expr = _parsePrecedence(_parsePrimary(), POSTFIX_PRECEDENCE);
         return _astFactory.unary(value, expr);
-      } else {
-        throw new ParseException("unexpected token: $value");
       }
     }
     return _parsePrimary();
@@ -156,9 +148,9 @@
           // TODO(justin): return keyword node
           return _astFactory.identifier('this');
         } else if (KEYWORDS.contains(keyword)) {
-          throw new ParseException('unexpected keyword: $keyword');
+          throw new ParseException('invalid keyword: $keyword');
         }
-        throw new ParseException('unrecognized keyword: $keyword');
+        throw new ArgumentError('unrecognized keyword: $keyword');
       case IDENTIFIER_TOKEN:
         return _parseInvokeOrIdentifier();
       case STRING_TOKEN:
@@ -177,7 +169,9 @@
         }
         return null;
       case COLON_TOKEN:
-        throw new ParseException('unexpected token ":"');
+        // TODO(justinfagnani): We need better errors throughout the parser, and
+        // we should be throwing ParseErrors to be caught by the caller
+        throw new ArgumentError('unexpected token ":"');
       default:
         return null;
     }
@@ -233,7 +227,7 @@
     var right = _parseExpression();
     if (right is! Identifier) {
       throw new ParseException(
-          "'as' statements must end with an identifier");
+          "as... statements must end with an identifier");
     }
     return _astFactory.asExpr(left, right);
   }
diff --git a/pkg/polymer_expressions/lib/polymer_expressions.dart b/pkg/polymer_expressions/lib/polymer_expressions.dart
index f27c2df..fa03dee 100644
--- a/pkg/polymer_expressions/lib/polymer_expressions.dart
+++ b/pkg/polymer_expressions/lib/polymer_expressions.dart
@@ -257,13 +257,15 @@
 typedef Object _Converter(Object);
 
 class _Binding extends Bindable {
+  static int __seq = 1;
+
+  final int _seq = __seq++;
+
   final Scope _scope;
   final _Converter _converter;
   final Expression _expr;
-
   Function _callback;
   StreamSubscription _sub;
-  ExpressionObserver _observer;
   var _value;
 
   _Binding(this._expr, this._scope, [converter])
@@ -309,19 +311,19 @@
     if (_callback != null) throw new StateError('already open');
 
     _callback = callback;
-    _observer = observe(_expr, _scope);
-    _sub = _observer.onUpdate.listen(_check)..onError((e, s) {
+    final expr = observe(_expr, _scope);
+//    _expr = expr;
+    _sub = expr.onUpdate.listen(_check)..onError((e, s) {
       new Completer().completeError(
-          "Error evaluating expression '$_observer': $e", s);
+          "Error evaluating expression '$expr': $e", s);
     });
-
     try {
       // this causes a call to _updateValue with the new value
-      update(_observer, _scope);
-      _check(_observer.currentValue, skipChanges: true);
+      update(expr, _scope);
+      _check(expr.currentValue, skipChanges: true);
     } catch (e, s) {
       new Completer().completeError(
-          "Error evaluating expression '$_observer': $e", s);
+          "Error evaluating expression '$expr': $e", s);
     }
     return _value;
   }
@@ -332,9 +334,6 @@
     _sub.cancel();
     _sub = null;
     _callback = null;
-
-    new Closer().visit(_observer);
-    _observer = null;
   }
 }
 
diff --git a/pkg/polymer_expressions/lib/tokenizer.dart b/pkg/polymer_expressions/lib/tokenizer.dart
index c8e5b13..d63f2b4 100644
--- a/pkg/polymer_expressions/lib/tokenizer.dart
+++ b/pkg/polymer_expressions/lib/tokenizer.dart
@@ -78,8 +78,6 @@
   // equality
   '!=': 7,
   '==': 7,
-  '!==': 7,
-  '===': 7,
 
   // relational
   '>=': 8,
@@ -280,11 +278,6 @@
       if (_TWO_CHAR_OPS.contains(op2)) {
         op = op2;
         _advance();
-        // kind of hacky check for === and !===, could be better / more general
-        if (_next == _EQ && (startChar == _BANG || startChar == _EQ)) {
-          op = op2 + '=';
-          _advance();
-        }
       } else {
         op = new String.fromCharCode(startChar);
       }
diff --git a/pkg/polymer_expressions/pubspec.yaml b/pkg/polymer_expressions/pubspec.yaml
index 262804e..c41cd8e 100644
--- a/pkg/polymer_expressions/pubspec.yaml
+++ b/pkg/polymer_expressions/pubspec.yaml
@@ -1,12 +1,12 @@
 name: polymer_expressions
-version: 0.11.0
+version: 0.10.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: An expressive custom binding syntax for HTML templates
 homepage: http://www.dartlang.org/polymer-dart/
 dependencies:
   browser: ">=0.10.0 <0.11.0"
-  observe: ">=0.10.1-dev <0.11.0"
-  template_binding: ">=0.11.0-dev <0.12.0"
+  observe: ">=0.10.0 <0.11.0"
+  template_binding: ">=0.10.0 <0.11.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
   benchmark_harness: ">=1.0.0 <2.0.0"
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index ea2642f..3664bee 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -22,7 +22,6 @@
 
 main() => dirtyCheckZone().run(() {
   useHtmlConfiguration();
-  smoke.useMirrors();
 
   group('bindings', () {
     var stop = null;
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
index c2dbdca..a73e037 100644
--- a/pkg/polymer_expressions/test/eval_test.dart
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -92,13 +92,6 @@
       expectEval('1 != 2', true);
       expectEval('1 != null', true);
 
-      var x = {};
-      var y = {};
-      expectEval('x === y', true, null, {'x': x, 'y': x});
-      expectEval('x !== y', false, null, {'x': x, 'y': x});
-      expectEval('x === y', false, null, {'x': x, 'y': y});
-      expectEval('x !== y', true, null, {'x': x, 'y': y});
-
       expectEval('1 > 1', false);
       expectEval('1 > 2', false);
       expectEval('2 > 1', true);
@@ -425,15 +418,11 @@
 Object evalString(String s, [Object model, Map vars]) =>
     eval(new Parser(s).parse(), new Scope(model: model, variables: vars));
 
-expectEval(String s, dynamic matcher, [Object model, Map vars = const {}]) {
-  var expr = new Parser(s).parse();
-  var scope = new Scope(model: model, variables: vars);
-  expect(eval(expr, scope), matcher, reason: s);
-
-  var observer = observe(expr, scope);
-  new Updater(scope).visit(observer);
-  expect(observer.currentValue, matcher, reason: s);
-}
+expectEval(String s, dynamic matcher, [Object model, Map vars = const {}]) =>
+    expect(
+        eval(new Parser(s).parse(), new Scope(model: model, variables: vars)),
+        matcher,
+        reason: s);
 
 expectObserve(String s, {
     Object model,
diff --git a/pkg/polymer_expressions/test/globals_test.dart b/pkg/polymer_expressions/test/globals_test.dart
index 2990723..8fdbc17 100644
--- a/pkg/polymer_expressions/test/globals_test.dart
+++ b/pkg/polymer_expressions/test/globals_test.dart
@@ -31,6 +31,7 @@
     });
 
     tearDown(() {
+      nodeBind(testDiv).unbindAll();
       testDiv.remove();
       testDiv = null;
     });
diff --git a/pkg/polymer_expressions/test/parser_test.dart b/pkg/polymer_expressions/test/parser_test.dart
index 8a7da1a..04f2ee7 100644
--- a/pkg/polymer_expressions/test/parser_test.dart
+++ b/pkg/polymer_expressions/test/parser_test.dart
@@ -11,9 +11,6 @@
 expectParse(String s, Expression e) =>
     expect(new Parser(s).parse(), e, reason: s);
 
-final Matcher throwsParseException =
-    throwsA(new isInstanceOf<ParseException>('ParseException'));
-
 main() {
 
   group('parser', () {
@@ -57,7 +54,7 @@
 
     test('should parse binary operators', () {
       var operators = ['+', '-', '*', '/', '%', '^', '==', '!=', '>', '<',
-          '>=', '<=', '||', '&&', '&', '===', '!==', '|'];
+          '>=', '<=', '||', '&&', '&'];
       for (var op in operators) {
         expectParse('a $op b', binary(ident('a'), op, ident('b')));
         expectParse('1 $op 2', binary(literal(1), op, literal(2)));
@@ -65,12 +62,6 @@
       }
     });
 
-    test('should thrown on unknown operators', () {
-      expect(() => parse('a ?? b'), throwsParseException);
-      expect(() => parse('a &&& b'), throwsParseException);
-      expect(() => parse('a ==== b'), throwsParseException);
-    });
-
     test('should give multiply higher associativity than plus', () {
       expectParse('a + b * c',
           binary(ident('a'), '+', binary(ident('b'), '*', ident('c'))));
@@ -164,7 +155,7 @@
       expectParse('a ? b : c', ternary(ident('a'), ident('b'), ident('c')));
       expectParse('a.a ? b.a : c.a', ternary(getter(ident('a'), 'a'),
           getter(ident('b'), 'a'), getter(ident('c'), 'a')));
-      expect(() => parse('a + 1 ? b + 1 :: c.d + 3'), throwsParseException);
+      expect(() => parse('a + 1 ? b + 1 :: c.d + 3'), throws);
     });
 
     test('ternary operators have lowest associativity', () {
@@ -198,7 +189,7 @@
     });
 
     test('should reject comprehension with non-assignable left expression', () {
-      expect(() => parse('a + 1 in b'), throwsParseException);
+      expect(() => parse('a + 1 in b'), throwsException);
     });
 
     test('should parse "as" expressions', () {
@@ -206,9 +197,10 @@
     });
 
     skip_test('should reject keywords as identifiers', () {
-      expect(() => parse('a.in'), throwsParseException);
-      expect(() => parse('a.as'), throwsParseException);
-      expect(() => parse('a.this'), throwsParseException);
+      expect(() => parse('a.in'), throws);
+      expect(() => parse('a.as'), throws);
+      // TODO: re-enable when 'this' is a keyword
+//      expect(() => parse('a.this'), throws);
     });
 
     test('should parse map literals', () {
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 16d816a..6dfe5b5 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -1,5 +1,5 @@
 name: smoke
-version: 0.1.0+1
+version: 0.1.0
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: "https://api.dartlang.org/apidocs/channels/be/#smoke"
 description: >
@@ -9,7 +9,7 @@
 dependencies:
   barback: ">=0.9.0 <0.15.0"
   logging: ">=0.9.0 <0.10.0"
-  analyzer: ">=0.13.0 <0.16.0"
+  analyzer: ">=0.13.0 <0.14.0"
 # TODO(sigmund): once we have some easier way to do global app-level
 # transformers, we might want to remove this transformer here and only apply it
 # in apps that need it.
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 5e8d985..0f299d7 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,20 +3,12 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
-#### Pub version 0.11.0-dev
-  * Ported up to commit [TemplateBinding#1cee02][5b9a3b] and
-    [NodeBind#c47bc1][c47bc1].
-
 #### Pub version 0.10.0
   * Applied patch to throw errors asycnhronously if property path evaluation
     fails.
   * Applied patch matching commit [51df59][] (fix parser to avoid allocating
     PropertyPath if there is a non-null delegateFn).
-  * Ported up to commit [TemplateBinding#99e52d][99e52d] and
-    [NodeBind#f7cc76][f7cc76].
+  * Ported JS code as of commit [fcb7a5][] 
 
-[1cee02]: https://github.com/Polymer/TemplateBinding/commit/5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
-[c47bc1]: https://github.com/Polymer/NodeBind/commit/c47bc1b40d1cf0123b29620820a7111471e83ff3
+[fcb7a5]: https://github.com/Polymer/TemplateBinding/commit/fcb7a502794f19544f2d4b77c96eebb70830591d
 [51df59]: https://github.com/Polymer/TemplateBinding/commit/51df59c16e0922dec041cfe604016aac00918d5d
-[99e52d]: https://github.com/Polymer/TemplateBinding/commit/99e52dd7fbaefdaee9807648d1d6097eb3e99eda
-[f7cc76]: https://github.com/Polymer/NodeBind/commit/f7cc76749e509e06fa7cbc9ba970f87f5fe33b5c
diff --git a/pkg/template_binding/lib/src/binding_delegate.dart b/pkg/template_binding/lib/src/binding_delegate.dart
index 215c9f3..4d9f8d2 100644
--- a/pkg/template_binding/lib/src/binding_delegate.dart
+++ b/pkg/template_binding/lib/src/binding_delegate.dart
@@ -2,7 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of template_binding;
+library template_binding.src.binding_delegate;
+
+import 'dart:html';
+import 'package:template_binding/template_binding.dart' show TemplateInstance;
 
 /**
  * Template Bindings native features enables a wide-range of use cases,
@@ -36,7 +39,7 @@
  * for more information about the binding delegate.
  */
 // TODO(jmesserly): need better api docs here. The link above seems out of date.
-class BindingDelegate {
+abstract class BindingDelegate {
   /**
    * Prepares a binding. This is called immediately after parsing a mustache
    * token with `{{ path }}` in the context of the [node] and the property named
@@ -61,13 +64,6 @@
    */
   PrepareInstancePositionChangedFunction prepareInstancePositionChanged(
       Element template) => null;
-
-  Expando<_InstanceBindingMap> _bindingMaps;
-
-  // TODO(jmesserly): if we have use this everywhere, we can avoid many
-  // delegate != null checks throughout the code, simplifying things.
-  // For now we just use it for _bindingMaps.
-  static final _DEFAULT = new BindingDelegate();
 }
 
 typedef PrepareBindingFunction(model, Node node, bool oneTime);
diff --git a/pkg/template_binding/lib/src/element.dart b/pkg/template_binding/lib/src/element.dart
index 6d82baa..bf9a036 100644
--- a/pkg/template_binding/lib/src/element.dart
+++ b/pkg/template_binding/lib/src/element.dart
@@ -9,6 +9,8 @@
   _ElementExtension(Element node) : super._(node);
 
   bind(String name, value, {bool oneTime: false}) {
+    _self.unbind(name);
+
     Element node = _node;
 
     if (node is OptionElement && name == 'value') {
@@ -29,7 +31,7 @@
 
       _open(value, (x) => _updateAttribute(_node, name, conditional, x));
     }
-    return _maybeUpdateBindings(name, value);
+    return bindings[name] = value;
   }
 
   void _updateOption(newValue) {
@@ -38,13 +40,10 @@
     var selectBinding = null;
     var select = node.parentNode;
     if (select is SelectElement) {
-      var bindings = nodeBind(select).bindings;
-      if (bindings != null) {
-        var valueBinding = bindings['value'];
-        if (valueBinding is _InputBinding) {
-          selectBinding = valueBinding;
-          oldValue = select.value;
-        }
+      var valueBinding = nodeBind(select).bindings['value'];
+      if (valueBinding is _InputBinding) {
+        selectBinding = valueBinding;
+        oldValue = select.value;
       }
     }
 
diff --git a/pkg/template_binding/lib/src/input_bindings.dart b/pkg/template_binding/lib/src/input_bindings.dart
index 3cdc7db..6292527 100644
--- a/pkg/template_binding/lib/src/input_bindings.dart
+++ b/pkg/template_binding/lib/src/input_bindings.dart
@@ -107,12 +107,9 @@
       case 'select-multiple':
       case 'select-one':
         return element.onChange;
-      case 'range':
-        if (window.navigator.userAgent.contains(new RegExp('Trident|MSIE'))) {
-          return element.onChange;
-        }
+      default:
+        return element.onInput;
     }
-    return element.onInput;
   }
 
   // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
@@ -151,17 +148,3 @@
     return value is int ? value : 0;
   }
 }
-
-_getTreeScope(Node node) {
-  Node parent;
-  while ((parent = node.parentNode) != null ) {
-    node = parent;
-  }
-
-  return _hasGetElementById(node) ? node : null;
-}
-
-// Note: JS code tests that getElementById is present. We can't do that
-// easily, so instead check for the types known to implement it.
-bool _hasGetElementById(Node node) =>
-    node is Document || node is ShadowRoot || node is SvgSvgElement;
diff --git a/pkg/template_binding/lib/src/input_element.dart b/pkg/template_binding/lib/src/input_element.dart
index 72cd7cc..e399435 100644
--- a/pkg/template_binding/lib/src/input_element.dart
+++ b/pkg/template_binding/lib/src/input_element.dart
@@ -21,8 +21,7 @@
       return null;
     }
 
-    // Note: call _updateBindings to always store binding reflection, because
-    // checkboxes may need to update bindings of other checkboxes.
-    return _updateBindings(name, new _InputBinding(_node, value, name));
+    _self.unbind(name);
+    return bindings[name] = new _InputBinding(_node, value, name);
   }
 }
diff --git a/pkg/template_binding/lib/src/instance_binding_map.dart b/pkg/template_binding/lib/src/instance_binding_map.dart
index bc4105a..ad34b6e 100644
--- a/pkg/template_binding/lib/src/instance_binding_map.dart
+++ b/pkg/template_binding/lib/src/instance_binding_map.dart
@@ -71,17 +71,3 @@
   _processBindings(clone, bindings, model, instanceBindings);
   return clone;
 }
-
-// TODO(rafaelw): Setup a MutationObserver on content which clears the expando
-// so that bindingMaps regenerate when template.content changes.
-_getInstanceBindingMap(DocumentFragment content, BindingDelegate delegate) {
-  if (delegate == null) delegate = BindingDelegate._DEFAULT;
-
-  if (delegate._bindingMaps == null) delegate._bindingMaps = new Expando();
-  var map = delegate._bindingMaps[content];
-  if (map == null) {
-    map = _createInstanceBindingMap(content, delegate);
-    delegate._bindingMaps[content] = map;
-  }
-  return map;
-}
diff --git a/pkg/template_binding/lib/src/mustache_tokens.dart b/pkg/template_binding/lib/src/mustache_tokens.dart
index c05dac1..7478d92 100644
--- a/pkg/template_binding/lib/src/mustache_tokens.dart
+++ b/pkg/template_binding/lib/src/mustache_tokens.dart
@@ -116,7 +116,6 @@
       tokens.add(oneTime); // ONETIME?
       onlyOneTime = onlyOneTime && oneTime;
       var delegateFn = fnFactory == null ? null : fnFactory(pathString);
-      // Don't try to parse the expression if there's a prepareBinding function
       if (delegateFn == null) {
         tokens.add(new PropertyPath(pathString)); // PATH
       } else {
diff --git a/pkg/template_binding/lib/src/node.dart b/pkg/template_binding/lib/src/node.dart
index fe6f9e6..595cbeb 100644
--- a/pkg/template_binding/lib/src/node.dart
+++ b/pkg/template_binding/lib/src/node.dart
@@ -7,24 +7,14 @@
 /** Extensions to the [Node] API. */
 class NodeBindExtension {
   final Node _node;
-
-  /**
-   * Gets the data bindings that are associated with this node, if any.
-   *
-   * This starts out null, and if [enableBindingsReflection] is enabled, calls
-   * to [bind] will initialize this field and the binding.
-   */
-  // Dart note: in JS this has a trailing underscore, meaning "private".
-  // But in dart if we made it _bindings, it wouldn't be accessible at all.
-  // It is unfortunately needed to implement Node.bind correctly.
-  Map<String, Bindable> bindings;
+  Map<String, Bindable> _bindings;
 
   NodeBindExtension._(this._node);
 
   /**
    * Binds the attribute [name] to the [path] of the [model].
    * Path is a String of accessors such as `foo.bar.baz`.
-   * Returns the [Bindable] instance.
+   * Returns the `Bindable` instance.
    */
   Bindable bind(String name, value, {bool oneTime: false}) {
     // TODO(jmesserly): in Dart we could deliver an async error, which would
@@ -34,18 +24,33 @@
     return null;
   }
 
-  /**
-   * Called when all [bind] calls are finished for a given template expansion.
-   */
-  void bindFinished() {}
+  /** Unbinds the attribute [name]. */
+  void unbind(String name) {
+    if (_bindings == null) return;
+    var binding = bindings.remove(name);
+    if (binding != null) binding.close();
+  }
+
+  /** Unbinds all bound attributes. */
+  void unbindAll() {
+    if (_bindings == null) return;
+    for (var binding in bindings.values.toList()) {
+      if (binding != null) binding.close();
+    }
+    _bindings = null;
+  }
+
+  // TODO(jmesserly): we should return a read-only wrapper here.
+  /** Gets the data bindings that are associated with this node. */
+  Map<String, Bindable> get bindings {
+    if (_bindings == null) _bindings = new LinkedHashMap<String, Bindable>();
+    return _bindings;
+  }
 
   /**
    * Dispatch support so custom HtmlElement's can override these methods.
-   *
-   * A public method like [this.bind] should not call another public method.
-   *
-   * Instead it should dispatch through [_self] to give the "overridden" method
-   * a chance to intercept.
+   * A public method like [this.bind] should not call another public method such
+   * as [this.unbind]. Instead it should dispatch through [_self.unbind].
    */
   NodeBindExtension get _self => _node is NodeBindExtension ? _node : this;
 
@@ -58,17 +63,6 @@
 
   _open(Bindable bindable, callback(value)) =>
       callback(bindable.open(callback));
-
-  Bindable _maybeUpdateBindings(String name, Bindable binding) {
-    return enableBindingsReflection ? _updateBindings(name, binding) : binding;
-  }
-
-  Bindable _updateBindings(String name, Bindable binding) {
-    if (bindings == null) bindings = {};
-    var old = bindings[name];
-    if (old != null) old.close();
-    return bindings[name] = binding;
-  }
 }
 
 
diff --git a/pkg/template_binding/lib/src/select_element.dart b/pkg/template_binding/lib/src/select_element.dart
index c936d40..f205a15 100644
--- a/pkg/template_binding/lib/src/select_element.dart
+++ b/pkg/template_binding/lib/src/select_element.dart
@@ -24,7 +24,7 @@
       return null;
     }
 
-    // Option update events may need to access select bindings.
-    return _updateBindings(name, new _InputBinding(_node, value, name));
+    _self.unbind(name);
+    return bindings[name] = new _InputBinding(_node, value, name);
   }
 }
diff --git a/pkg/template_binding/lib/src/template.dart b/pkg/template_binding/lib/src/template.dart
index f9d0e1e..d085a89 100644
--- a/pkg/template_binding/lib/src/template.dart
+++ b/pkg/template_binding/lib/src/template.dart
@@ -21,8 +21,6 @@
 
   _InstanceBindingMap _bindingMap;
 
-  Node _refContent;
-
   TemplateBindExtension._(Element node) : super(node);
 
   Element get _node => super._node;
@@ -30,22 +28,6 @@
   TemplateBindExtension get _self => super._node is TemplateBindExtension
       ? _node : this;
 
-  Bindable bind(String name, value, {bool oneTime: false}) {
-    if (name != 'ref') return super.bind(name, value, oneTime: oneTime);
-
-
-    var ref = oneTime ? value : value.open((ref) {
-      _node.attributes['ref'] = ref;
-      _refChanged();
-    });
-
-    _node.attributes['ref'] = ref;
-    _refChanged();
-    if (oneTime) return null;
-
-    return _updateBindings('ref', value);
-  }
-
   _TemplateIterator _processBindingDirectives(_TemplateBindingMap directives) {
     if (_iterator != null) _iterator._closeDependencies();
 
@@ -56,19 +38,16 @@
       if (_iterator != null) {
         _iterator.close();
         _iterator = null;
+        bindings.remove('iterator');
       }
       return null;
     }
 
     if (_iterator == null) {
-      _iterator = new _TemplateIterator(this);
+      bindings['iterator'] = _iterator = new _TemplateIterator(this);
     }
 
     _iterator._updateDependencies(directives, model);
-
-    _templateObserver.observe(_node,
-        attributes: true, attributeFilter: ['ref']);
-
     return _iterator;
   }
 
@@ -81,47 +60,38 @@
    * bindings without walking the tree. This is not normally necesssary, but is
    * used internally by the system.
    */
-  DocumentFragment createInstance([model, BindingDelegate delegate]) {
-    if (delegate == null) delegate = _bindingDelegate;
-    if (_refContent == null) _refContent = templateBind(_ref).content;
+  DocumentFragment createInstance([model, BindingDelegate delegate,
+      List<Bindable> instanceBindings]) {
 
-    var content = _refContent;
-    if (content.firstChild == null) return _emptyInstance;
+    final content = templateBind(ref).content;
+    // Dart note: we store _bindingMap on the TemplateBindExtension instead of
+    // the "content" because we already have an expando for it.
+    var map = _bindingMap;
+    if (map == null || !identical(map.content, content)) {
+      // TODO(rafaelw): Setup a MutationObserver on content to detect
+      // when the instanceMap is invalid.
+      map = _createInstanceBindingMap(content, delegate);
+      map.content = content;
+      _bindingMap = map;
+    }
 
-    final map = _getInstanceBindingMap(content, delegate);
     final staging = _getTemplateStagingDocument();
     final instance = _stagingDocument.createDocumentFragment();
-
-    final instanceExt = new _InstanceExtension();
-    _instanceExtension[instance] = instanceExt
-      .._templateCreator = _node
-      .._protoContent = content;
+    _templateCreator[instance] = _node;
 
     final instanceRecord = new TemplateInstance(model);
-    nodeBindFallback(instance)._templateInstance = instanceRecord;
 
     var i = 0;
-    bool collectTerminator = false;
     for (var c = content.firstChild; c != null; c = c.nextNode, i++) {
-      // 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 (c.nextNode == null) collectTerminator = true;
-
       final childMap = map != null ? map.getChild(i) : null;
       var clone = _cloneAndBindInstance(c, instance, _stagingDocument,
-          childMap, model, delegate, instanceExt._bindings);
-
+          childMap, model, delegate, instanceBindings);
       nodeBindFallback(clone)._templateInstance = instanceRecord;
-      if (collectTerminator) instanceExt._terminator = clone;
     }
 
     instanceRecord._firstNode = instance.firstChild;
     instanceRecord._lastNode = instance.lastChild;
 
-    instanceExt._protoContent = null;
-    instanceExt._templateCreator = null;
     return instance;
   }
 
@@ -149,12 +119,7 @@
    */
   BindingDelegate get bindingDelegate => _bindingDelegate;
 
-
   void set bindingDelegate(BindingDelegate value) {
-    if (_bindingDelegate != null) {
-      throw new StateError('Template must be cleared before a new '
-          'bindingDelegate can be assigned');
-    }
     _bindingDelegate = value;
 
     // Clear cached state based on the binding delegate.
@@ -179,40 +144,35 @@
     _processBindings(_node, map, _model);
   }
 
-  _refChanged() {
-    if (_iterator == null || _refContent == templateBind(_ref).content) return;
-
-    _refContent = null;
-    _iterator._valueChanged(null);
-    _iterator._updateIteratedValue(null);
-  }
-
-  void clear() {
-    _model = null;
-    _bindingDelegate = null;
-    if (bindings != null) {
-      var ref = bindings.remove('ref');
-      if (ref != null) ref.close();
-    }
-    _refContent = null;
-    if (_iterator == null) return;
-    _iterator._valueChanged(null);
-    _iterator.close();
-    _iterator = null;
-  }
-
   /** Gets the template this node refers to. */
-  Element get _ref {
+  Element get ref {
     _decorate();
 
-    var ref = _searchRefId(_node, _node.attributes['ref']);
-    if (ref == null) {
-      ref = _templateInstanceRef;
-      if (ref == null) return _node;
+    Element result = null;
+    var refId = _node.attributes['ref'];
+    if (refId != null) {
+      var treeScope = _getTreeScope(_node);
+      if (treeScope != null) {
+        result = treeScope.getElementById(refId);
+      }
+      if (result == null) {
+        var instanceRoot = _getInstanceRoot(_node);
+
+        // TODO(jmesserly): this won't work if refId is a number
+        // Similar to bug: https://github.com/Polymer/ShadowDOM/issues/340
+        if (instanceRoot != null) {
+          result = instanceRoot.querySelector('#$refId');
+        }
+      }
     }
 
-    var nextRef = templateBindFallback(ref)._ref;
-    return nextRef != null ? nextRef : ref;
+    if (result == null) {
+      result = _templateInstanceRef;
+      if (result == null) return _node;
+    }
+
+    var nextRef = templateBind(result).ref;
+    return nextRef != null ? nextRef : result;
   }
 
   /**
@@ -241,7 +201,6 @@
     if (_templateIsDecorated == true) return false;
 
     _injectStylesheet();
-    _globalBaseUriWorkaround();
 
     var templateElementExt = this;
     _templateIsDecorated = true;
@@ -315,8 +274,6 @@
       var doc = _ownerStagingDocument[owner];
       if (doc == null) {
         doc = owner.implementation.createHtmlDocument('');
-        _isStagingDocument[doc] = true;
-        _baseUriWorkaround(doc);
         _ownerStagingDocument[owner] = doc;
       }
       _stagingDocument = doc;
@@ -425,107 +382,34 @@
         ..text = '$_allTemplatesSelectors { display: none; }';
     document.head.append(style);
   }
-
-  static bool _initBaseUriWorkaround;
-
-  static void _globalBaseUriWorkaround() {
-    if (_initBaseUriWorkaround == true) return;
-    _initBaseUriWorkaround = true;
-
-    var t = document.createElement('template');
-    if (t is TemplateElement) {
-      var d = t.content.ownerDocument;
-      if (d.documentElement == null) {
-        d.append(d.createElement('html')).append(d.createElement('head'));
-      }
-      // don't patch this if TemplateBinding.js already has.
-      if (d.head.querySelector('base') == null) {
-        _baseUriWorkaround(d);
-      }
-    }
-  }
-
-  // TODO(rafaelw): Remove when fix for
-  // https://codereview.chromium.org/164803002/
-  // makes it to Chrome release.
-  static void _baseUriWorkaround(HtmlDocument doc) {
-    BaseElement base = doc.createElement('base');
-    base.href = document.baseUri;
-    doc.head.append(base);
-  }
-
-  static final _templateObserver = new MutationObserver((records, _) {
-    for (MutationRecord record in records) {
-      templateBindFallback(record.target)._refChanged();
-    }
-  });
-
 }
 
-final DocumentFragment _emptyInstance = () {
-  var empty = new DocumentFragment();
-  _instanceExtension[empty] = new _InstanceExtension();
-  return empty;
-}();
+final _templateCreator = new Expando();
 
-// TODO(jmesserly): if we merged with wtih TemplateInstance, it seems like it
-// would speed up some operations (e.g. _getInstanceRoot wouldn't need to walk
-// the parent chain).
-class _InstanceExtension {
-  final List _bindings = [];
-  Node _terminator;
-  Element _templateCreator;
-  DocumentFragment _protoContent;
-}
-
-// TODO(jmesserly): this is private in JS but public for us because pkg:polymer
-// uses it.
-List getTemplateInstanceBindings(DocumentFragment fragment) {
-  var ext = _instanceExtension[fragment];
-  return ext != null ? ext._bindings : ext;
-}
-
-/// Gets the root of the current node's parent chain
-_getFragmentRoot(Node node) {
-  var p;
-  while ((p = node.parentNode) != null) {
-    node = p;
-  }
-  return node;
-}
-
-Node _searchRefId(Node node, String id) {
-  if (id == null || id == '') return null;
-
-  final selector = '#$id';
+_getTreeScope(Node node) {
   while (true) {
-    node = _getFragmentRoot(node);
+    var parent = node.parentNode;
+    if (parent != null) {
+      node = parent;
+    } else {
+      var creator = _templateCreator[node];
+      if (creator == null) break;
 
-    Node ref = null;
-
-    _InstanceExtension instance = _instanceExtension[node];
-    if (instance != null && instance._protoContent != null) {
-      ref = instance._protoContent.querySelector(selector);
-    } else if (_hasGetElementById(node)) {
-      ref = (node as dynamic).getElementById(id);
+      node = creator;
     }
-
-    if (ref != null) return ref;
-
-    if (instance == null) return null;
-    node = instance._templateCreator;
-    if (node == null) return null;
   }
+
+  // Note: JS code tests that getElementById is present. We can't do that
+  // easily, so instead check for the types known to implement it.
+  if (node is Document || node is ShadowRoot || node is SvgSvgElement) {
+    return node;
+  }
+  return null;
 }
 
 _getInstanceRoot(node) {
   while (node.parentNode != null) {
     node = node.parentNode;
   }
-  _InstanceExtension instance = _instanceExtension[node];
-  return instance != null && instance._templateCreator != null ? node : null;
+  return _templateCreator[node] != null ? node : null;
 }
-
-final Expando<_InstanceExtension> _instanceExtension = new Expando();
-
-final _isStagingDocument = new Expando();
diff --git a/pkg/template_binding/lib/src/template_iterator.dart b/pkg/template_binding/lib/src/template_iterator.dart
index a2839ea..cc519f2 100644
--- a/pkg/template_binding/lib/src/template_iterator.dart
+++ b/pkg/template_binding/lib/src/template_iterator.dart
@@ -178,19 +178,17 @@
     [List<Bindable> instanceBindings]) {
 
   final bindings = map.bindings;
-  final nodeExt = nodeBind(node);
   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 = nodeExt.bind(name, value, oneTime: tokens.onlyOneTime);
+    var binding = nodeBind(node).bind(name, value, oneTime: tokens.onlyOneTime);
     if (binding != null && instanceBindings != null) {
       instanceBindings.add(binding);
     }
   }
 
-  nodeExt.bindFinished();
   if (map is! _TemplateBindingMap) return;
 
   final templateExt = nodeBindFallback(node);
@@ -208,7 +206,11 @@
 class _TemplateIterator extends Bindable {
   final TemplateBindExtension _templateExt;
 
-  final List<DocumentFragment> _instances = [];
+  /**
+   * Flattened array of tuples:
+   * <instanceTerminatorNode, [bindingsSetupByInstance]>
+   */
+  final List _terminators = [];
 
   /** A copy of the last rendered [_presentValue] list state. */
   final List _iteratedValue = [];
@@ -330,49 +332,62 @@
         _presentValue != null ? _presentValue : []));
   }
 
-  Node _getLastInstanceNode(int index) {
+  Node _getTerminatorAt(int index) {
     if (index == -1) return _templateElement;
-    // TODO(jmesserly): we could avoid this expando lookup by caching the
-    // instance extension instead of the instance.
-    var instance = _instanceExtension[_instances[index]];
-    var terminator = instance._terminator;
-    if (terminator == null) return _getLastInstanceNode(index - 1);
-
+    var terminator = _terminators[index * 2];
     if (!isSemanticTemplate(terminator) ||
         identical(terminator, _templateElement)) {
       return terminator;
     }
 
-    var subtemplateIterator = templateBindFallback(terminator)._iterator;
-    if (subtemplateIterator == null) return terminator;
+    var subIter = templateBindFallback(terminator)._iterator;
+    if (subIter == null) return terminator;
 
-    return subtemplateIterator._getLastTemplateNode();
+    return subIter._getTerminatorAt(subIter._terminators.length ~/ 2 - 1);
   }
 
-  Node _getLastTemplateNode() => _getLastInstanceNode(_instances.length - 1);
+  // TODO(rafaelw): If we inserting sequences of instances we can probably
+  // avoid lots of calls to _getTerminatorAt(), or cache its result.
+  void _insertInstanceAt(int index, DocumentFragment fragment,
+        List<Node> instanceNodes, List<Bindable> instanceBindings) {
 
-  void _insertInstanceAt(int index, DocumentFragment fragment) {
-    var previousInstanceLast = _getLastInstanceNode(index - 1);
-    var parent = _templateElement.parentNode;
-
-    _instances.insert(index, fragment);
-    parent.insertBefore(fragment, previousInstanceLast.nextNode);
-  }
-
-  DocumentFragment _extractInstanceAt(int index) {
-    var previousInstanceLast = _getLastInstanceNode(index - 1);
-    var lastNode = _getLastInstanceNode(index);
-    var parent = _templateElement.parentNode;
-    var instance = _instances.removeAt(index);
-
-    while (lastNode != previousInstanceLast) {
-      var node = previousInstanceLast.nextNode;
-      if (node == lastNode) lastNode = previousInstanceLast;
-
-      instance.append(node..remove());
+    var previousTerminator = _getTerminatorAt(index - 1);
+    var terminator = null;
+    if (fragment != null) {
+      terminator = fragment.lastChild;
+    } else if (instanceNodes != null && instanceNodes.isNotEmpty) {
+      terminator = instanceNodes.last;
     }
+    if (terminator == null) terminator = previousTerminator;
 
-    return instance;
+    _terminators.insertAll(index * 2, [terminator, instanceBindings]);
+    var parent = _templateElement.parentNode;
+    var insertBeforeNode = previousTerminator.nextNode;
+
+    if (fragment != null) {
+      parent.insertBefore(fragment, insertBeforeNode);
+    } else if (instanceNodes != null) {
+      for (var node in instanceNodes) {
+        parent.insertBefore(node, insertBeforeNode);
+      }
+    }
+  }
+
+  _BoundNodes _extractInstanceAt(int index) {
+    var instanceNodes = <Node>[];
+    var previousTerminator = _getTerminatorAt(index - 1);
+    var terminator = _getTerminatorAt(index);
+    var instanceBindings = _terminators[index * 2 + 1];
+    _terminators.removeRange(index * 2, index * 2 + 2);
+
+    var parent = _templateElement.parentNode;
+    while (terminator != previousTerminator) {
+      var node = previousTerminator.nextNode;
+      if (node == terminator) terminator = previousTerminator;
+      node.remove();
+      instanceNodes.add(node);
+    }
+    return new _BoundNodes(instanceNodes, instanceBindings);
   }
 
   void _handleSplices(List<ListChangeRecord> splices) {
@@ -401,15 +416,11 @@
       }
     }
 
-    // Instance Removals.
-    var instanceCache = new HashMap(equals: identical);
+    var instanceCache = new HashMap<Object, _BoundNodes>(equals: identical);
     var removeDelta = 0;
     for (var splice in splices) {
       for (var model in splice.removed) {
-        var instance = _extractInstanceAt(splice.index + removeDelta);
-        if (instance != _emptyInstance) {
-          instanceCache[model] = instance;
-        }
+        instanceCache[model] = _extractInstanceAt(splice.index + removeDelta);
       }
 
       removeDelta -= splice.addedCount;
@@ -421,16 +432,22 @@
           addIndex++) {
 
         var model = _iteratedValue[addIndex];
-        DocumentFragment instance = instanceCache.remove(model);
-        if (instance == null) {
+        var fragment = null;
+        var instance = instanceCache.remove(model);
+        List instanceBindings;
+        List instanceNodes = null;
+        if (instance != null && instance.nodes.isNotEmpty) {
+          instanceBindings = instance.instanceBindings;
+          instanceNodes = instance.nodes;
+        } else {
           try {
+            instanceBindings = [];
             if (_instanceModelFn != null) {
               model = _instanceModelFn(model);
             }
-            if (model == null) {
-              instance = _emptyInstance;
-            } else {
-              instance = _templateExt.createInstance(model, delegate);
+            if (model != null) {
+              fragment = _templateExt.createInstance(model, delegate,
+                  instanceBindings);
             }
           } catch (e, s) {
             // Dart note: we propagate errors asynchronously here to avoid
@@ -443,26 +460,33 @@
             // called from createInstance, but that requires enough refactoring
             // that it should be done upstream first. See dartbug.com/17789.
             new Completer().completeError(e, s);
-            instance = _emptyInstance;
           }
         }
 
-        _insertInstanceAt(addIndex, instance);
+        _insertInstanceAt(addIndex, fragment, instanceNodes, instanceBindings);
       }
     }
 
     for (var instance in instanceCache.values) {
-      _closeInstanceBindings(instance);
+      _closeInstanceBindings(instance.instanceBindings);
     }
 
     if (_instancePositionChangedFn != null) _reportInstancesMoved(splices);
   }
 
   void _reportInstanceMoved(int index) {
-    var instance = _instances[index];
-    if (instance == _emptyInstance) return;
+    var previousTerminator = _getTerminatorAt(index - 1);
+    var terminator = _getTerminatorAt(index);
+    if (identical(previousTerminator, terminator)) {
+      return; // instance has zero nodes.
+    }
 
-    _instancePositionChangedFn(nodeBind(instance).templateInstance, index);
+    // We must use the first node of the instance, because any subsequent
+    // nodes may have been generated by sub-templates.
+    // TODO(rafaelw): This is brittle WRT instance mutation -- e.g. if the
+    // first node was removed by script.
+    var instance = nodeBind(previousTerminator.nextNode).templateInstance;
+    _instancePositionChangedFn(instance, index);
   }
 
   void _reportInstancesMoved(List<ListChangeRecord> splices) {
@@ -488,16 +512,15 @@
 
     if (offset == 0) return;
 
-    var length = _instances.length;
+    var length = _terminators.length ~/ 2;
     while (index < length) {
       _reportInstanceMoved(index);
       index++;
     }
   }
 
-  void _closeInstanceBindings(DocumentFragment instance) {
-    var bindings = _instanceExtension[instance]._bindings;
-    for (var binding in bindings) binding.close();
+  void _closeInstanceBindings(List<Bindable> instanceBindings) {
+    for (var binding in instanceBindings) binding.close();
   }
 
   void _unobserve() {
@@ -510,8 +533,11 @@
     if (_closed) return;
 
     _unobserve();
-    _instances.forEach(_closeInstanceBindings);
-    _instances.clear();
+    for (var i = 1; i < _terminators.length; i += 2) {
+      _closeInstanceBindings(_terminators[i]);
+    }
+
+    _terminators.clear();
     _closeDependencies();
     _templateExt._iterator = null;
     _closed = true;
diff --git a/pkg/template_binding/lib/src/text.dart b/pkg/template_binding/lib/src/text.dart
index d057be7..fd4c44a 100644
--- a/pkg/template_binding/lib/src/text.dart
+++ b/pkg/template_binding/lib/src/text.dart
@@ -18,8 +18,9 @@
       return null;
     }
 
+    unbind(name);
     _open(value, _updateText);
-    return _maybeUpdateBindings(name, value);
+    return bindings[name] = value;
   }
 
   _updateText(value) {
diff --git a/pkg/template_binding/lib/src/text_area_element.dart b/pkg/template_binding/lib/src/text_area_element.dart
index 89fdf0c..361f7c1 100644
--- a/pkg/template_binding/lib/src/text_area_element.dart
+++ b/pkg/template_binding/lib/src/text_area_element.dart
@@ -13,12 +13,13 @@
   Bindable bind(String name, value, {bool oneTime: false}) {
     if (name != 'value') return super.bind(name, value, oneTime: oneTime);
 
-    _node.attributes.remove(name);
     if (oneTime) {
       _InputBinding._updateProperty(_node, value, name);
       return null;
     }
 
-    return _maybeUpdateBindings(name, new _InputBinding(_node, value, name));
+    _self.unbind(name);
+    _node.attributes.remove(name);
+    return bindings[name] = new _InputBinding(_node, value, name);
   }
 }
diff --git a/pkg/template_binding/lib/template_binding.dart b/pkg/template_binding/lib/template_binding.dart
index 1e8b3a8..97daeab 100644
--- a/pkg/template_binding/lib/template_binding.dart
+++ b/pkg/template_binding/lib/template_binding.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
@@ -24,9 +24,11 @@
 import 'dart:svg' show SvgSvgElement;
 import 'package:observe/observe.dart';
 
+import 'src/binding_delegate.dart';
 import 'src/mustache_tokens.dart';
 
-part 'src/binding_delegate.dart';
+export 'src/binding_delegate.dart';
+
 part 'src/element.dart';
 part 'src/input_bindings.dart';
 part 'src/input_element.dart';
@@ -153,17 +155,6 @@
 bool isSemanticTemplate(Node n) => n is Element &&
     (_isHtmlTemplate(n) || _isAttributeTemplate(n) || _isSvgTemplate(n));
 
-/** Returns true if this is the staging document for a template. */
-bool isTemplateStagingDocument(Document d) => _isStagingDocument[d] == true;
-
-
-/**
- * True to enable [NodeBindingExtension.bindings]. This can be used by tools
- * such as UI builders to easily inspect live bindings. Defaults to false for
- * performance reasons.
- */
-bool enableBindingsReflection = false;
-
 // TODO(jmesserly): const set would be better
 const _SEMANTIC_TEMPLATE_TAGS = const {
   'caption': null,
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index c84d4f5..e12fb39 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.10.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/template_binding/test/binding_syntax.dart b/pkg/template_binding/test/binding_syntax.dart
index 859698b..f5e6afd9 100644
--- a/pkg/template_binding/test/binding_syntax.dart
+++ b/pkg/template_binding/test/binding_syntax.dart
@@ -22,10 +22,7 @@
         '<template bind>{{ foo }}'
           '<template bind>{{ foo }}</template>'
         '</template>');
-    var template = templateBind(div.firstChild);
-    template
-      ..model = model
-      ..bindingDelegate = testSyntax;
+    recursivelySetTemplateModel(div, model, testSyntax);
     return new Future(() {
       expect(div.nodes.length, 4);
       expect(div.nodes.last.text, 'bar');
@@ -52,9 +49,7 @@
     var div = createTestHtml('<template repeat>{{ foo }}</template>');
 
     var template = div.nodes[0];
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = testSyntax;
+    recursivelySetTemplateModel(div, model, testSyntax);
     return new Future(() {
 
       expect(div.nodes.length, 4);
@@ -79,9 +74,7 @@
     var template = div.firstChild;
     var delegate = new TestInstanceModelSyntax();
 
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = delegate;
+    recursivelySetTemplateModel(div, model, delegate);
     return new Future(() {
       expect(delegate.prepareCount, 1);
       expect(delegate.callCount, 3);
@@ -101,9 +94,7 @@
     var delegate = new TestPositionChangedSyntax();
 
     var template = div.nodes[0];
-    templateBind(template)
-      ..model = model
-      ..bindingDelegate = delegate;
+    recursivelySetTemplateModel(div, model, delegate);
     return new Future(() {
 
       expect(div.nodes.length, 4);
@@ -145,23 +136,12 @@
       expect(div.nodes[1].text, 'i:0 - a:1');
       expect(div.nodes[2].text, 'i:1 - a:2');
 
-      expect(() {
-        template.bindingDelegate = new UpdateBindingDelegateB();
-      }, throws);
-
-      template.clear();
-      expect(div.nodes.length, 1);
-
-      template
-        ..bindingDelegate = new UpdateBindingDelegateB()
-        ..model = model;
-
+      template.bindingDelegate = new UpdateBindingDelegateB();
       model.add(3);
     }).then(nextMicrotask).then((_) {
-      // All instances should reflect delegateB
       expect(4, div.nodes.length);
-      expect(div.nodes[1].text, 'I:0 - A:1-narg');
-      expect(div.nodes[2].text, 'I:2 - A:2-narg');
+      expect(div.nodes[1].text, 'i:0 - a:1');
+      expect(div.nodes[2].text, 'i:1 - a:2');
       expect(div.nodes[3].text, 'I:4 - A:3-narg');
     });
   });
@@ -171,10 +151,7 @@
     var div = createTestHtml(
         '<template bind>'
         '{{ foo }} + {{ 2x: bar }} + {{ 4x: bar }}</template>');
-    var template = templateBind(div.firstChild);
-    template
-      ..model = model
-      ..bindingDelegate = new TimesTwoSyntax();
+    recursivelySetTemplateModel(div, model, new TimesTwoSyntax());
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.nodes.last.text, '2 + 8 + ');
@@ -186,28 +163,6 @@
     });
   });
 
-  test('CreateInstance', () {
-    var delegateFoo = new SimpleTextDelegate('foo');
-    var delegateBar = new SimpleTextDelegate('bar');
-
-    var div = createTestHtml('<template bind>[[ 2x: bar ]]</template>');
-    var template = templateBind(div.firstChild);
-    template..bindingDelegate = delegateFoo..model = {};
-
-    return new Future(() {
-      expect(div.nodes.length, 2);
-      expect(div.lastChild.text, 'foo');
-
-      var fragment = template.createInstance({});
-      expect(fragment.nodes.length, 1);
-      expect(fragment.lastChild.text, 'foo');
-
-      fragment = template.createInstance({}, delegateBar);
-      expect(fragment.nodes.length, 1);
-      expect(fragment.lastChild.text, 'bar');
-    });
-  });
-
   // Note: issue-141 test not included here as it's not related to the
   // BindingDelegate
 }
@@ -231,14 +186,6 @@
   }
 }
 
-class SimpleTextDelegate extends BindingDelegate {
-  final String text;
-  SimpleTextDelegate(this.text);
-
-  prepareBinding(path, name, node) =>
-      name != 'text' ? null : (_, __, ___) => text;
-}
-
 class TestModelSyntax extends BindingDelegate {
   var log = [];
   var altModels = new ListQueue();
diff --git a/pkg/template_binding/test/custom_element_bindings_test.dart b/pkg/template_binding/test/custom_element_bindings_test.dart
index 17068a4..fb2b8ba 100644
--- a/pkg/template_binding/test/custom_element_bindings_test.dart
+++ b/pkg/template_binding/test/custom_element_bindings_test.dart
@@ -20,9 +20,8 @@
   useHtmlConfiguration();
 
   _registered = customElementsReady.then((_) {
-    document.registerElement('my-custom-element', MyCustomElement);
-    document.registerElement('with-attrs-custom-element',
-        WithAttrsCustomElement);
+    document.register('my-custom-element', MyCustomElement);
+    document.register('with-attrs-custom-element', WithAttrsCustomElement);
   });
 
   group('Custom Element Bindings', customElementBindingsTest);
@@ -39,15 +38,13 @@
     testDiv = null;
   });
 
-  test('override bind/bindFinished', () {
+  test('override bind/unbind/unbindAll', () {
     var element = new MyCustomElement();
     var model = toObservable({'a': new Point(123, 444), 'b': new Monster(100)});
 
-    var pointBinding = nodeBind(element)
-        .bind('my-point', new PathObserver(model, 'a'));
-
-    var scaryBinding = nodeBind(element)
-        .bind('scary-monster', new PathObserver(model, 'b'));
+    nodeBind(element)
+        ..bind('my-point', new PathObserver(model, 'a'))
+        ..bind('scary-monster', new PathObserver(model, 'b'));
 
     expect(element.attributes, isNot(contains('my-point')));
     expect(element.attributes, isNot(contains('scary-monster')));
@@ -58,8 +55,7 @@
     model['a'] = null;
     return new Future(() {
       expect(element.myPoint, null);
-      expect(element.bindFinishedCalled, 0);
-      pointBinding.close();
+      nodeBind(element).unbind('my-point');
 
       model['a'] = new Point(1, 2);
       model['b'] = new Monster(200);
@@ -67,11 +63,10 @@
       expect(element.scaryMonster, model['b']);
       expect(element.myPoint, null, reason: 'a was unbound');
 
-      scaryBinding.close();
+      nodeBind(element).unbindAll();
       model['b'] = null;
     }).then(endOfMicrotask).then((_) {
       expect(element.scaryMonster.health, 200);
-      expect(element.bindFinishedCalled, 0);
     });
   });
 
@@ -129,6 +124,7 @@
     templateBind(div.query('template')).model = model;
     var element;
     return new Future(() {
+      print('!!! running future');
       element = div.nodes[1];
 
       expect(element is MyCustomElement, true,
@@ -140,29 +136,21 @@
       expect(element.attributes, isNot(contains('my-point')));
       expect(element.attributes, isNot(contains('scary-monster')));
 
-      expect(element.bindFinishedCalled, 1);
-
       model['a'] = null;
     }).then(endOfMicrotask).then((_) {
       expect(element.myPoint, null);
-      expect(element.bindFinishedCalled, 1);
-
 
       templateBind(div.query('template')).model = null;
     }).then(endOfMicrotask).then((_) {
-      // Note: the detached element
-      expect(element.parentNode is DocumentFragment, true,
-          reason: 'removed element is added back to its document fragment');
-      expect(element.parentNode.parentNode, null,
-          reason: 'document fragment is detached');
-      expect(element.bindFinishedCalled, 1);
+
+      expect(element.parentNode, null, reason: 'element was detached');
 
       model['a'] = new Point(1, 2);
       model['b'] = new Monster(200);
     }).then(endOfMicrotask).then((_) {
+
       expect(element.myPoint, null, reason: 'model was unbound');
       expect(element.scaryMonster.health, 100, reason: 'model was unbound');
-      expect(element.bindFinishedCalled, 1);
     });
   });
 
@@ -173,11 +161,10 @@
   Monster(this.health);
 }
 
-/** Demonstrates a custom element overriding bind/bindFinished. */
+/** Demonstrates a custom element overriding bind/unbind/unbindAll. */
 class MyCustomElement extends HtmlElement implements NodeBindExtension {
   Point myPoint;
   Monster scaryMonster;
-  int bindFinishedCalled = 0;
 
   factory MyCustomElement() => new Element.tag('my-custom-element');
 
@@ -192,23 +179,16 @@
           _setProperty(name, value);
           return null;
         }
+        unbind(name);
         _setProperty(name, value.open((x) => _setProperty(name, x)));
-
-        if (!enableBindingsReflection) return value;
-        if (bindings == null) bindings = {};
-        var old = bindings[name];
-        if (old != null) old.close();
         return bindings[name] = value;
     }
     return nodeBindFallback(this).bind(name, value, oneTime: oneTime);
   }
 
-  void bindFinished() {
-    bindFinishedCalled++;
-  }
-
+  unbind(name) => nodeBindFallback(this).unbind(name);
+  unbindAll() => nodeBindFallback(this).unbindAll();
   get bindings => nodeBindFallback(this).bindings;
-  set bindings(x) => nodeBindFallback(this).bindings = x;
   get templateInstance => nodeBindFallback(this).templateInstance;
 
   void _setProperty(String property, newValue) {
@@ -248,6 +228,6 @@
 
   V remove(Object key) {
     log.add(['remove', key]);
-    return super.remove(key);
+    super.remove(key);
   }
 }
diff --git a/pkg/template_binding/test/node_bind_test.dart b/pkg/template_binding/test/node_bind_test.dart
index b355394..cfe8d7c 100644
--- a/pkg/template_binding/test/node_bind_test.dart
+++ b/pkg/template_binding/test/node_bind_test.dart
@@ -9,30 +9,25 @@
 
 import 'package:observe/observe.dart'
     show toObservable, PathObserver, PropertyPath;
-import 'package:template_binding/template_binding.dart'
-    show nodeBind, enableBindingsReflection;
+import 'package:template_binding/template_binding.dart' show nodeBind;
 
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 import 'utils.dart';
 
-// Ported from: https://github.com/Polymer/NodeBind/blob/master/tests/tests.js
-
-var bindings;
+// Note: this file ported from
+// https://github.com/toolkitchen/mdv/blob/master/tests/node_bindings.js
 
 main() => dirtyCheckZone().run(() {
   useHtmlConfiguration();
 
   setUp(() {
     document.body.append(testDiv = new DivElement());
-    bindings = [];
   });
 
   tearDown(() {
     testDiv.remove();
     testDiv = null;
-    for (var b in bindings) if (b != null) b.close();
-    bindings = null;
   });
 
   group('Text bindings', testBindings);
@@ -44,25 +39,31 @@
   test('Basic', () {
     var text = new Text('hi');
     var model = toObservable({'a': 1});
-    bindings.add(nodeBind(text).bind('text', new PathObserver(model, 'a')));
+    nodeBind(text).bind('text', new PathObserver(model, 'a'));
     expect(text.text, '1');
 
     model['a'] = 2;
     return new Future(() {
       expect(text.text, '2');
+
+      nodeBind(text).unbind('text');
+      model['a'] = 3;
+    }).then(endOfMicrotask).then((_) {
+      // TODO(rafaelw): Throw on binding to unavailable property?
+      expect(text.text, '2');
     });
   });
 
   test('oneTime', () {
     var text = new Text('hi');
-    bindings.add(nodeBind(text).bind('text', 1, oneTime: true));
+    nodeBind(text).bind('text', 1, oneTime: true);
     expect(text.text, '1');
   });
 
   test('No Path', () {
     var text = new Text('hi');
     var model = 1;
-    bindings.add(nodeBind(text).bind('text', new PathObserver(model)));
+    nodeBind(text).bind('text', new PathObserver(model));
     expect(text.text, '1');
   });
 
@@ -75,37 +76,28 @@
   });
 
   test('Observer is Model', () {
-    // Dart note: we don't have _allObserversCount so we use binding reflection
-    // instead.
-    enableBindingsReflection = true;
+    var text = new Text('');
+    var model = toObservable({'a': {'b': {'c': 1}}});
+    var observer = new PathObserver(model, 'a.b.c');
+    nodeBind(text).bind('text', observer);
+    expect(text.text, '1');
 
-    // This future is here so we can turn off bindings reflection reliably.
-    Text text;
+    var binding = nodeBind(text).bindings['text'];
+    expect(binding, observer, reason: 'should reuse observer');
+
+    model['a']['b']['c'] = 2;
     return new Future(() {
-      text = new Text('');
-      var model = toObservable({'a': {'b': {'c': 1}}});
-      var observer = new PathObserver(model, 'a.b.c');
-      bindings.add(nodeBind(text).bind('text', observer));
-      expect(text.text, '1');
-
-      var binding = nodeBind(text).bindings['text'];
-      expect(binding, observer, reason: 'should reuse observer');
-
-      model['a']['b']['c'] = 2;
-    }).then(endOfMicrotask).then((_) {
       expect(text.text, '2');
-    }).whenComplete(() {
-      enableBindingsReflection = false;
+      nodeBind(text).unbind('text');
     });
   });
 }
 
 elementBindings() {
-
   test('Basic', () {
     var el = new DivElement();
     var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
+    nodeBind(el).bind('foo', new PathObserver(model, 'a'));
 
     return new Future(() {
       expect(el.attributes['foo'], '1');
@@ -124,45 +116,17 @@
     });
   });
 
-  // Dart specific test
-  test('enableBindingsReflection defaults to off', () {
-    expect(enableBindingsReflection, false);
-
-    var el = new DivElement();
-    var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
-
-    expect(nodeBind(el).bindings, null);
-  });
-
-  test('enableBindingsReflection', () {
-    enableBindingsReflection = true;
-    try {
-      var el = testDiv.append(new DivElement());
-      var model = toObservable({'a': '1'});
-      bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'a')));
-      bindings.add(nodeBind(el).bind('bar', new PathObserver(model, 'a')));
-      bindings.add(nodeBind(el).bind('baz', new PathObserver(model, 'a')));
-
-      expect(nodeBind(el).bindings.keys,
-          unorderedEquals(['foo', 'bar', 'baz']));
-
-    } finally {
-      enableBindingsReflection = false;
-    }
-  });
-
   test('oneTime', () {
     var el = testDiv.append(new DivElement());
     var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo', 1, oneTime: true));
+    nodeBind(el).bind('foo', 1, oneTime: true);
     expect('1', el.attributes['foo']);
   });
 
   test('No Path', () {
     var el = testDiv.append(new DivElement());
     var model = 1;
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model)));
+    nodeBind(el).bind('foo', new PathObserver(model));
     return new Future(() {
       expect(el.attributes['foo'], '1');
     });
@@ -171,7 +135,7 @@
   test('Path unreachable', () {
     var el = testDiv.append(new DivElement());
     var model = toObservable({});
-    bindings.add(nodeBind(el).bind('foo', new PathObserver(model, 'bar')));
+    nodeBind(el).bind('foo', new PathObserver(model, 'bar'));
     return new Future(() {
       expect(el.attributes['foo'], '');
     });
@@ -180,7 +144,7 @@
   test('Dashes', () {
     var el = testDiv.append(new DivElement());
     var model = toObservable({'a': '1'});
-    bindings.add(nodeBind(el).bind('foo-bar', new PathObserver(model, 'a')));
+    nodeBind(el).bind('foo-bar', new PathObserver(model, 'a'));
     return new Future(() {
       expect(el.attributes['foo-bar'], '1');
       model['a'] = '2';
@@ -193,9 +157,8 @@
   test('Element.id, Element.hidden?', () {
     var element = new DivElement();
     var model = toObservable({'a': 1, 'b': 2});
-    bindings.add(
-        nodeBind(element).bind('hidden?', new PathObserver(model, 'a')));
-    bindings.add(nodeBind(element).bind('id', new PathObserver(model, 'b')));
+    nodeBind(element).bind('hidden?', new PathObserver(model, 'a'));
+    nodeBind(element).bind('id', new PathObserver(model, 'b'));
 
     expect(element.attributes, contains('hidden'));
     expect(element.attributes['hidden'], '');
@@ -222,7 +185,7 @@
   test('Element.id - path unreachable', () {
     var element = testDiv.append(new DivElement());
     var model = toObservable({});
-    bindings.add(nodeBind(element).bind('id', new PathObserver(model, 'a')));
+    nodeBind(element).bind('id', new PathObserver(model, 'a'));
     return new Future(() => expect(element.id, ''));
   });
 }
@@ -232,7 +195,7 @@
     var el = new Element.tag(tagName);
     testDiv.nodes.add(el);
     var model = toObservable({'x': 42});
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'x')));
+    nodeBind(el).bind('value', new PathObserver(model, 'x'));
     expect(el.value, '42');
 
     model['x'] = 'Hi';
@@ -243,26 +206,37 @@
       el.value = 'changed';
       dispatchEvent('input', el);
       expect(model['x'], 'changed');
+
+      nodeBind(el).unbind('value');
+
+      el.value = 'changed again';
+      dispatchEvent('input', el);
+      expect(model['x'], 'changed');
+
+      nodeBind(el).bind('value', new PathObserver(model, 'x'));
+      model['x'] = null;
+    }).then(endOfMicrotask).then((_) {
+      expect(el.value, '');
     });
   }
 
   inputTextAreaValueOnetime(String tagName) {
     var el = testDiv.append(new Element.tag(tagName));
-    bindings.add(nodeBind(el).bind('value', 42, oneTime: true));
+    nodeBind(el).bind('value', 42, oneTime: true);
     expect(el.value, '42');
   }
 
   inputTextAreaNoPath(String tagName) {
     var el = testDiv.append(new Element.tag(tagName));
     var model = 42;
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model)));
+    nodeBind(el).bind('value', new PathObserver(model));
     expect(el.value, '42');
   }
 
   inputTextAreaPathUnreachable(String tagName) {
     var el = testDiv.append(new Element.tag(tagName));
     var model = toObservable({});
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'a')));
+    nodeBind(el).bind('value', new PathObserver(model, 'a'));
     expect(el.value, '');
   }
 
@@ -294,7 +268,7 @@
     var input = new InputElement();
     input.type = 'radio';
     var model = toObservable({'x': true});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
+    nodeBind(input).bind('checked', new PathObserver(model, 'x'));
     expect(input.checked, true);
 
     model['x'] = false;
@@ -306,7 +280,7 @@
       dispatchEvent('change', input);
       expect(model['x'], true, reason: 'input.checked should set model');
 
-      bindings[0].close();
+      nodeBind(input).unbind('checked');
 
       input.checked = false;
       dispatchEvent('change', input);
@@ -318,25 +292,44 @@
   test('Input.value - user value rejected', () {
     var model = toObservable({'val': 'ping'});
 
-    var rejector = new PathObserver(model, 'val');
-    rejector.open(() {
-      model['val'] = 'ping';
-    });
-
     var el = new InputElement();
-    bindings.add(nodeBind(el).bind('value', new PathObserver(model, 'val')));
-
+    nodeBind(el).bind('value', new PathObserver(model, 'val'));
     return new Future(() {
       expect(el.value, 'ping');
 
       el.value = 'pong';
       dispatchEvent('input', el);
+      expect(model['val'], 'pong');
 
+      // Try a deep path.
+      model = toObservable({'a': {'b': {'c': 'ping'}}});
+
+      nodeBind(el).bind('value', new PathObserver(model, 'a.b.c'));
     }).then(endOfMicrotask).then((_) {
-      // rejector will have set the bound value back to 'ping'.
       expect(el.value, 'ping');
 
-      rejector.close();
+      el.value = 'pong';
+      dispatchEvent('input', el);
+      expect(new PropertyPath('a.b.c').getValueFrom(model), 'pong');
+
+      // Start with the model property being absent.
+      model['a']['b'].remove('c');
+    }).then(endOfMicrotask).then((_) {
+      expect(el.value, '');
+
+      el.value = 'pong';
+      dispatchEvent('input', el);
+      expect(new PropertyPath('a.b.c').getValueFrom(model), 'pong');
+    }).then(endOfMicrotask).then((_) {
+
+      // Model property unreachable (and unsettable).
+      model['a'].remove('b');
+    }).then(endOfMicrotask).then((_) {
+      expect(el.value, '');
+
+      el.value = 'pong';
+      dispatchEvent('input', el);
+      expect(new PropertyPath('a.b.c').getValueFrom(model), null);
     });
   });
 
@@ -345,7 +338,7 @@
     el.type = 'checkbox';
 
     var model = toObservable({'x': true});
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'x')));
+    nodeBind(el).bind('checked', new PathObserver(model, 'x'));
     expect(el.checked, true);
 
     model['x'] = false;
@@ -365,7 +358,7 @@
   test('Checkbox Input.checked - oneTime', () {
     var input = testDiv.append(new InputElement());
     input.type = 'checkbox';
-    bindings.add(nodeBind(input).bind('checked', true, oneTime: true));
+    nodeBind(input).bind('checked', true, oneTime: true);
     expect(input.checked, true, reason: 'checked was set');
   });
 
@@ -373,7 +366,7 @@
     var input = testDiv.append(new InputElement());
     input.type = 'checkbox';
     var model = toObservable({});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
+    nodeBind(input).bind('checked', new PathObserver(model, 'x'));
     expect(input.checked, false);
   });
 
@@ -382,7 +375,7 @@
 
     var el = testDiv.append(new InputElement());
     el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
+    nodeBind(el).bind('checked', new PathObserver(model, 'val'));
     return new Future(() {
       expect(el.checked, true);
 
@@ -413,7 +406,7 @@
     var el = new InputElement();
     testDiv.append(el);
     el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
+    nodeBind(el).bind('checked', new PathObserver(model, 'val'));
     return new Future(() {
       expect(el.checked, true);
 
@@ -435,7 +428,7 @@
     var el = new InputElement();
     testDiv.append(el);
     el.type = 'checkbox';
-    bindings.add(nodeBind(el).bind('checked', new PathObserver(model, 'val')));
+    nodeBind(el).bind('checked', new PathObserver(model, 'val'));
     return new Future(() {
       expect(el.checked, true);
 
@@ -455,7 +448,7 @@
     var input = testDiv.append(new InputElement());
     input.type = 'radio';
     var model = toObservable({'x': true});
-    bindings.add(nodeBind(input).bind('checked', new PathObserver(model, 'x')));
+    nodeBind(input).bind('checked', new PathObserver(model, 'x'));
     expect(input.checked, true);
 
     model['x'] = false;
@@ -466,13 +459,19 @@
       input.checked = true;
       dispatchEvent('change', input);
       expect(model['x'], true);
+
+      nodeBind(input).unbind('checked');
+
+      input.checked = false;
+      dispatchEvent('change', input);
+      expect(model['x'], true);
     });
   });
 
   test('Radio Input.checked - oneTime', () {
     var input = testDiv.append(new InputElement());
     input.type = 'radio';
-    bindings.add(nodeBind(input).bind('checked', true, oneTime: true));
+    nodeBind(input).bind('checked', true, oneTime: true);
     expect(input.checked, true, reason: 'checked was set');
   });
 
@@ -486,26 +485,22 @@
     var el1 = container.append(new InputElement());
     el1.type = 'radio';
     el1.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el1).bind('checked', new PathObserver(model, 'val1')));
+    nodeBind(el1).bind('checked', new PathObserver(model, 'val1'));
 
     var el2 = container.append(new InputElement());
     el2.type = 'radio';
     el2.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el2).bind('checked', new PathObserver(model, 'val2')));
+    nodeBind(el2).bind('checked', new PathObserver(model, 'val2'));
 
     var el3 = container.append(new InputElement());
     el3.type = 'radio';
     el3.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el3).bind('checked', new PathObserver(model, 'val3')));
+    nodeBind(el3).bind('checked', new PathObserver(model, 'val3'));
 
     var el4 = container.append(new InputElement());
     el4.type = 'radio';
     el4.name = 'othergroup';
-    bindings.add(
-        nodeBind(el4).bind('checked', new PathObserver(model, 'val4')));
+    nodeBind(el4).bind('checked', new PathObserver(model, 'val4'));
 
     return new Future(() {
       expect(el1.checked, true);
@@ -543,7 +538,8 @@
     if (!ShadowRoot.supported) return null;
 
     var shadowRoot = new DivElement().createShadowRoot();
-    return radioInputChecked2(shadowRoot);
+    return radioInputChecked2(shadowRoot)
+        .whenComplete(() => unbindAll(shadowRoot));
   });
 
   radioInputCheckedMultipleForms(host) {
@@ -561,29 +557,25 @@
     form1.append(el1);
     el1.type = 'radio';
     el1.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el1).bind('checked', new PathObserver(model, 'val1')));
+    nodeBind(el1).bind('checked', new PathObserver(model, 'val1'));
 
     var el2 = new InputElement();
     form1.append(el2);
     el2.type = 'radio';
     el2.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el2).bind('checked', new PathObserver(model, 'val2')));
+    nodeBind(el2).bind('checked', new PathObserver(model, 'val2'));
 
     var el3 = new InputElement();
     form2.append(el3);
     el3.type = 'radio';
     el3.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el3).bind('checked', new PathObserver(model, 'val3')));
+    nodeBind(el3).bind('checked', new PathObserver(model, 'val3'));
 
     var el4 = new InputElement();
     form2.append(el4);
     el4.type = 'radio';
     el4.name = RADIO_GROUP_NAME;
-    bindings.add(
-        nodeBind(el4).bind('checked', new PathObserver(model, 'val4')));
+    nodeBind(el4).bind('checked', new PathObserver(model, 'val4'));
 
     return new Future(() {
       expect(el1.checked, true);
@@ -619,7 +611,8 @@
     if (!ShadowRoot.supported) return null;
 
     var shadowRoot = new DivElement().createShadowRoot();
-    return radioInputCheckedMultipleForms(shadowRoot);
+    return radioInputCheckedMultipleForms(shadowRoot)
+        .whenComplete(() => unbindAll(shadowRoot));
   });
 
   test('Select.selectedIndex', () {
@@ -631,8 +624,7 @@
 
     var model = toObservable({'val': 2});
 
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
+    nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val'));
     return new Future(() {
       expect(select.selectedIndex, 2);
 
@@ -649,7 +641,7 @@
     var option1 = select.append(new OptionElement());
     var option2 = select.append(new OptionElement());
 
-    bindings.add(nodeBind(select).bind('selectedIndex', 2, oneTime: true));
+    nodeBind(select).bind('selectedIndex', 2, oneTime: true);
     return new Future(() => expect(select.selectedIndex, 2));
   });
 
@@ -663,8 +655,7 @@
 
     var model = toObservable({'val': 'foo'});
 
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
+    nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val'));
     return new Future(() => expect(select.selectedIndex, 0));
   });
 
@@ -678,15 +669,14 @@
 
     var model = toObservable({});
 
-    bindings.add(
-        nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val')));
+    nodeBind(select).bind('selectedIndex', new PathObserver(model, 'val'));
     return new Future(() => expect(select.selectedIndex, 0));
   });
 
   test('Option.value', () {
     var option = testDiv.append(new OptionElement());
     var model = toObservable({'x': 42});
-    bindings.add(nodeBind(option).bind('value', new PathObserver(model, 'x')));
+    nodeBind(option).bind('value', new PathObserver(model, 'x'));
     expect(option.value, '42');
 
     model['x'] = 'Hi';
@@ -696,7 +686,7 @@
 
   test('Option.value - oneTime', () {
     var option = testDiv.append(new OptionElement());
-    bindings.add(nodeBind(option).bind('value', 42, oneTime: true));
+    nodeBind(option).bind('value', 42, oneTime: true);
     expect(option.value, '42');
   });
 
@@ -714,14 +704,11 @@
       'selected': 'b'
     });
 
-    bindings.add(
-        nodeBind(option0).bind('value', new PathObserver(model, 'opt0')));
-    bindings.add(
-        nodeBind(option1).bind('value', new PathObserver(model, 'opt1')));
-    bindings.add(
-        nodeBind(option2).bind('value', new PathObserver(model, 'opt2')));
-    bindings.add(
-        nodeBind(select).bind('value', new PathObserver(model, 'selected')));
+    nodeBind(option0).bind('value', new PathObserver(model, 'opt0'));
+    nodeBind(option1).bind('value', new PathObserver(model, 'opt1'));
+    nodeBind(option2).bind('value', new PathObserver(model, 'opt2'));
+
+    nodeBind(select).bind('value', new PathObserver(model, 'selected'));
     return new Future(() {
       expect(select.value, 'b');
 
diff --git a/pkg/template_binding/test/template_binding_test.dart b/pkg/template_binding/test/template_binding_test.dart
index 42fd389..4757ac0 100644
--- a/pkg/template_binding/test/template_binding_test.dart
+++ b/pkg/template_binding/test/template_binding_test.dart
@@ -6,7 +6,6 @@
 
 import 'dart:async';
 import 'dart:html';
-import 'dart:js' show JsObject;
 import 'dart:math' as math;
 import 'package:observe/observe.dart';
 import 'package:template_binding/template_binding.dart';
@@ -17,7 +16,8 @@
 import 'binding_syntax.dart' show syntaxTests;
 import 'utils.dart';
 
-// Note: this file ported from TemplateBinding's tests/tests.js
+// Note: this file ported from
+// https://github.com/Polymer/TemplateBinding/blob/fcb7a502794f19544f2d4b77c96eebb70830591d/tests/tests.js
 
 // TODO(jmesserly): submit a small cleanup patch to original. I fixed some
 // cases where "div" and "t" were unintentionally using the JS global scope;
@@ -38,7 +38,6 @@
 
   tearDown(() {
     testDiv.remove();
-    clearAllTemplates(testDiv);
     testDiv = null;
   });
 
@@ -80,13 +79,7 @@
 templateInstantiationTests() {
   // Dart note: renamed some of these tests to have unique names
 
-  test('accessing bindingDelegate getter without Bind', () {
-    var div = createTestHtml('<template>');
-    var template = div.firstChild;
-    expect(templateBind(template).bindingDelegate, null);
-  });
-
-  test('Bind - simple', () {
+  test('Bind (simple)', () {
     var div = createTestHtml('<template bind={{}}>text</template>');
     templateBind(div.firstChild).model = {};
     return new Future(() {
@@ -139,8 +132,8 @@
     var template = div.firstChild;
     var doc = document.implementation.createHtmlDocument('');
     doc.adoptNode(div);
-    templateBind(template).model = {};
-    return new Future(() => expect(div.nodes.length, 2));
+    recursivelySetTemplateModel(template, {});
+    return new Future(() => expect(div.nodes.length, 1));
   });
 
   test('Empty Bind', () {
@@ -363,9 +356,8 @@
   test('Bind If, 2', () {
     var div = createTestHtml(
         '<template bind="{{ foo }}" if="{{ bar }}">{{ bat }}</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'bar': null, 'foo': { 'bat': 'baz' } });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 1);
 
@@ -399,13 +391,12 @@
 
   test('Empty-If', () {
     var div = createTestHtml('<template if>{{ value }}</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = null;
+    recursivelySetTemplateModel(div, null);
     return new Future(() {
       expect(div.nodes.length, 1);
 
-      templateBind(template).model = m;
+      recursivelySetTemplateModel(div, m);
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes.length, 2);
       expect(div.lastChild.text, 'foo');
@@ -414,9 +405,8 @@
 
   test('OneTime - simple text', () {
     var div = createTestHtml('<template bind>[[ value ]]</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.text, 'foo');
@@ -432,9 +422,8 @@
   test('OneTime - compound text', () {
     var div = createTestHtml(
         '<template bind>[[ foo ]] bar [[ baz ]]</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'foo': 'FOO', 'baz': 'BAZ' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.text, 'FOO bar BAZ');
@@ -452,9 +441,8 @@
   test('OneTime/Dynamic Mixed - compound text', () {
     var div = createTestHtml(
         '<template bind>[[ foo ]] bar {{ baz }}</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'foo': 'FOO', 'baz': 'BAZ' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.text, 'FOO bar BAZ');
@@ -472,9 +460,8 @@
   test('OneTime - simple attribute', () {
     var div = createTestHtml(
         '<template bind><div foo="[[ value ]]"></div></template>');
-    var template = div.firstChild;
     var m = toObservable({ 'value': 'foo' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.attributes['foo'], 'foo');
@@ -493,9 +480,8 @@
         '<template bind>'
           '<div foo="[[ value ]]:[[ otherValue ]]"></div>'
         '</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'value': 'foo', 'otherValue': 'bar' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.attributes['foo'], 'foo:bar');
@@ -514,9 +500,8 @@
         '<template bind>'
           '<div foo="{{ value }}:[[ otherValue ]]"></div>'
         '</template>');
-    var template = div.firstChild;
     var m = toObservable({ 'value': 'foo', 'otherValue': 'bar' });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 2);
       expect(div.lastChild.attributes['foo'], 'foo:bar');
@@ -707,9 +692,8 @@
 
   test('TextTemplateWithNullStringBinding', () {
     var div = createTestHtml('<template bind={{}}>a{{b}}c</template>');
-    var template = div.firstChild;
     var model = toObservable({'b': 'B'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -763,9 +747,8 @@
   test('TextTemplateWithBindingAndConditional', () {
     var div = createTestHtml(
         '<template bind="{{}}" if="{{ d }}">a{{b}}c</template>');
-    var template = div.firstChild;
     var model = toObservable({'b': 'B', 'd': 1});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -795,9 +778,8 @@
     var div = createTestHtml(
         '<template bind="{{ b }}">a{{value}}c</template>');
     expect(div.nodes.length, 1);
-    var template = div.firstChild;
     var model = toObservable({'b': {'value': 'B'}});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -814,9 +796,8 @@
         '<template bind="{{}}">'
         '<div foo="a{{b}}c"></div>'
         '</template>');
-    var template = div.firstChild;
     var model = toObservable({'b': 'B'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -837,9 +818,8 @@
         '<template bind="{{}}">'
         '<div foo?="{{b}}"></div>'
         '</template>');
-    var template = div.firstChild;
     var model = toObservable({'b': 'b'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -935,8 +915,8 @@
       {'val': 8},
       {'val': 1}
     ]);
+    recursivelySetTemplateModel(div, model);
     var template = div.firstChild;
-    templateBind(template).model = model;
 
     return new Future(() {
       expect(div.nodes.length, 6);
@@ -949,7 +929,7 @@
       checkExpandos(template.nextNode);
 
       model = toObservable(model.reversed);
-      templateBind(template).model = model;
+      recursivelySetTemplateModel(div, model);
     }).then(endOfMicrotask).then((_) {
       checkExpandos(template.nextNode);
 
@@ -970,9 +950,9 @@
     var div = createTestHtml(
         '<template bind="{{ foo }}">{{ bar }}</template>');
 
-    var template = div.firstChild;
     var model = toObservable({ 'foo': { 'bar': 5 }});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
+    var template = div.firstChild;
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -981,7 +961,7 @@
       checkExpandos(template.nextNode);
 
       model = toObservable({'foo': model['foo']});
-      templateBind(template).model = model;
+      recursivelySetTemplateModel(div, model);
     }).then(endOfMicrotask).then((_) {
       checkExpandos(template.nextNode);
     });
@@ -991,9 +971,8 @@
     var div = createTestHtml(
         '<template repeat>text</template>');
 
-    var template = div.firstChild;
     var model = toObservable([0, 1, 2]);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 4);
@@ -1015,10 +994,9 @@
   test('Removal from iteration needs to unbind', () {
     var div = createTestHtml(
         '<template repeat="{{}}"><a>{{v}}</a></template>');
-    var template = div.firstChild;
     var model = toObservable([{'v': 0}, {'v': 1}, {'v': 2}, {'v': 3},
         {'v': 4}]);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     var nodes, vs;
     return new Future(() {
@@ -1045,39 +1023,11 @@
     });
   });
 
-  test('Template.clear', () {
-    var div = createTestHtml(
-        '<template repeat>{{}}</template>');
-    var template = div.firstChild;
-    templateBind(template).model = [0, 1, 2];
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect(div.nodes[1].text, '0');
-      expect(div.nodes[2].text, '1');
-      expect(div.nodes[3].text, '2');
-
-      // clear() synchronously removes instances and clears the model.
-      templateBind(div.firstChild).clear();
-      expect(div.nodes.length, 1);
-      expect(templateBind(template).model, null);
-
-      // test that template still works if new model assigned
-      templateBind(template).model = [3, 4];
-
-    }).then(endOfMicrotask).then((_) {
-      expect(div.nodes.length, 3);
-      expect(div.nodes[1].text, '3');
-      expect(div.nodes[2].text, '4');
-    });
-  });
-
   test('DOM Stability on Iteration', () {
     var div = createTestHtml(
         '<template repeat="{{}}">{{}}</template>');
-    var template = div.firstChild;
     var model = toObservable([1, 2, 3, 4, 5]);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     var nodes;
     return new Future(() {
@@ -1128,13 +1078,12 @@
         '<template repeat="{{}}">{{value}}</template>');
     expect(div.nodes.length, 1);
 
-    var template = div.firstChild;
     var model = toObservable([
       {'value': 0},
       {'value': 1},
       {'value': 2}
     ]);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 4);
@@ -1163,9 +1112,8 @@
         '<template bind="{{}}">'
         '<input value="{{x}}">'
         '</template>');
-    var template = div.firstChild;
     var model = toObservable({'x': 'hi'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 2);
@@ -1193,20 +1141,19 @@
         '</template>'
         '<template bind="{{ XY }}" id="t2" ref="t1"></template>');
 
-    var t1 = document.getElementById('t1');
-    var t2 = document.getElementById('t2');
     var model = toObservable({
       'XX': {'name': 'Leela', 'title': 'Captain'},
       'XY': {'name': 'Fry', 'title': 'Delivery boy'},
       'XZ': {'name': 'Zoidberg', 'title': 'Doctor'}
     });
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
+      var t1 = document.getElementById('t1');
       var instance = t1.nextElementSibling;
       expect(instance.text, 'Crew member: Leela, Job title: Captain');
 
+      var t2 = document.getElementById('t2');
       instance = t2.nextElementSibling;
       expect(instance.text, 'Crew member: Fry, Job title: Delivery boy');
 
@@ -1231,9 +1178,8 @@
 
   test('Bind', () {
     var div = createTestHtml('<template bind="{{}}">Hi {{ name }}</template>');
-    var template = div.firstChild;
     var model = toObservable({'name': 'Leela'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() => expect(div.nodes[1].text, 'Hi Leela'));
   });
@@ -1241,9 +1187,8 @@
   test('BindPlaceHolderHasNewLine', () {
     var div = createTestHtml(
         '<template bind="{{}}">Hi {{\nname\n}}</template>');
-    var template = div.firstChild;
     var model = toObservable({'name': 'Leela'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() => expect(div.nodes[1].text, 'Hi Leela'));
   });
@@ -1259,58 +1204,23 @@
     var t1 = div.nodes.first;
     var t2 = div.nodes[1];
 
+    expect(templateBind(t2).ref, t1);
+
     var model = toObservable({'name': 'Fry'});
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() => expect(t2.nextNode.text, 'Hi Fry'));
   });
 
-  test('Ref at multiple', () {
-    // Note: this test is asserting that template "ref"erences can be located
-    // at various points. In particular:
-    // -in the document (at large) (e.g. ref=doc)
-    // -within template content referenced from sub-content
-    //   -both before and after the reference
-    // The following asserts ensure that all referenced templates content is
-    // found.
-    var div = createTestHtml(
-      '<template bind>'
-        '<template bind ref=doc></template>'
-        '<template id=elRoot>EL_ROOT</template>'
-        '<template bind>'
-          '<template bind ref=elRoot></template>'
-          '<template bind>'
-            '<template bind ref=subA></template>'
-            '<template id=subB>SUB_B</template>'
-            '<template bind>'
-              '<template bind ref=subB></template>'
-            '</template>'
-          '</template>'
-          '<template id=subA>SUB_A</template>'
-        '</template>'
-      '</template>'
-      '<template id=doc>DOC</template>');
-    var t = div.firstChild;
-    var fragment = templateBind(t).createInstance({});
-    expect(fragment.nodes.length, 14);
-    expect(fragment.nodes[1].text, 'DOC');
-    expect(fragment.nodes[5].text, 'EL_ROOT');
-    expect(fragment.nodes[8].text, 'SUB_A');
-    expect(fragment.nodes[12].text, 'SUB_B');
-    div.append(fragment);
-  });
 
   test('Update Ref', () {
-    // Updating ref by observing the attribute is dependent on MutationObserver
     var div = createTestHtml(
         '<template id=A>Hi, {{}}</template>'
         '<template id=B>Hola, {{}}</template>'
         '<template ref=A repeat></template>');
 
-    var template = div.nodes[2];
     var model = new ObservableList.from(['Fry']);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() {
       expect(div.nodes.length, 4);
@@ -1319,35 +1229,10 @@
       div.nodes[2].attributes['ref'] = 'B';
       model.add('Leela');
 
-    }).then(nextMicrotask).then((x) {
-      expect(div.nodes.length, 5);
-
-      expect('Hola, Fry', div.nodes[3].text);
-      expect('Hola, Leela', div.nodes[4].text);
-    });
-  });
-
-  test('Bound Ref', () {
-    var div = createTestHtml(
-        '<template id=A>Hi, {{}}</template>'
-        '<template id=B>Hola, {{}}</template>'
-        '<template ref="{{ ref }}" repeat="{{ people }}"></template>');
-
-    var template = div.nodes[2];
-    var model = toObservable({'ref': 'A', 'people': ['Fry']});
-    templateBind(template).model = model;
-
-    return new Future(() {
-      expect(div.nodes.length, 4);
-      expect('Hi, Fry', div.nodes[3].text);
-
-      model['ref'] = 'B';
-      model['people'].add('Leela');
-
     }).then(endOfMicrotask).then((x) {
       expect(div.nodes.length, 5);
 
-      expect('Hola, Fry', div.nodes[3].text);
+      expect('Hi, Fry', div.nodes[3].text);
       expect('Hola, Leela', div.nodes[4].text);
     });
   });
@@ -1363,8 +1248,7 @@
     var t1 = div.firstChild;
     var t2 = div.nodes[1];
     var model = toObservable({'name': 'Fry', 'id': id });
-    templateBind(t1).model = model;
-    templateBind(t2).model = model;
+    recursivelySetTemplateModel(div, model);
 
     return new Future(() => expect(t2.nextNode.text, 'Hi Fry'));
   });
@@ -1392,7 +1276,7 @@
       ]
     });
 
-    templateBind(t).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
 
       assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
@@ -1436,7 +1320,6 @@
         '<template repeat="{{ contacts }}">'
           'Hi {{ name }}'
         '</template>');
-    var template = div.firstChild;
     var m = toObservable({
       'contacts': [
         {'name': 'Raf'},
@@ -1444,8 +1327,9 @@
         {'name': 'Neal'}
       ]
     });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
+      var t = div.nodes.first;
       assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
     });
   });
@@ -1460,7 +1344,7 @@
       {'name': 'Arv'},
       {'name': 'Neal'}
     ]);
-    templateBind(t).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
 
       assertNodesAre(div, ['Hi Raf', 'Hi Arv', 'Hi Neal']);
@@ -1499,13 +1383,13 @@
     var t = div.nodes.first;
 
     var m = null;
-    templateBind(t).model = m;
+    recursivelySetTemplateModel(div, m);
 
     expect(div.nodes.length, 1);
 
     t.attributes['iterate'] = '';
     m = toObservable({});
-    templateBind(t).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() => expect(div.nodes.length, 1));
   });
 
@@ -1519,7 +1403,7 @@
       {'name': 'Arv'},
       {'name': 'Neal'}
     ]);
-    templateBind(t).model = m;
+    recursivelySetTemplateModel(div, m);
 
     var node1, node2, node3;
     return new Future(() {
@@ -1548,9 +1432,9 @@
   test('TwoLevelsDeepBug', () {
     var div = createTestHtml(
       '<template bind="{{}}"><span><span>{{ foo }}</span></span></template>');
-    var template = div.firstChild;
+
     var model = toObservable({'foo': 'bar'});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes[1].nodes[0].nodes[0].text, 'bar');
     });
@@ -1602,8 +1486,6 @@
       m['a']['c'] = toObservable({'d': 22});
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes[start + 2].text, '22');
-
-      //clearAllTemplates(div);
     });
   }
 
@@ -1744,8 +1626,6 @@
           '<template ref="t" repeat="{{items}}"></template>'
         '</template>');
 
-    var template = div.firstChild;
-
     var m = toObservable([
       {
         'name': 'Item 1',
@@ -1770,7 +1650,7 @@
       },
     ]);
 
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
 
     int i = 1;
     return new Future(() {
@@ -1806,7 +1686,6 @@
           '</select>'
         '</template>');
 
-    var template = div.firstChild;
     var m = toObservable({
       'selected': 1,
       'groups': [{
@@ -1814,7 +1693,7 @@
       }],
     });
 
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
 
     var completer = new Completer();
 
@@ -1830,6 +1709,9 @@
             'after template expands.');
 
         expect(select.nodes[0].tagName, 'TEMPLATE');
+        expect((templateBind(templateBind(select.nodes[0]).ref)
+            .content.nodes[0] as Element).tagName, 'OPTGROUP');
+
         var optgroup = select.nodes[1];
         expect(optgroup.nodes[0].tagName, 'TEMPLATE');
         expect(optgroup.nodes[1].tagName, 'OPTION');
@@ -1857,14 +1739,13 @@
             '</tr>'
           '</template>'
         '</tbody></table>');
-    var template = div.firstChild.firstChild.firstChild;
 
     var m = toObservable([
       [{ 'val': 0 }, { 'val': 1 }],
       [{ 'val': 2 }, { 'val': 3 }]
     ]);
 
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       var tbody = div.nodes[0].nodes[0];
 
@@ -1895,14 +1776,13 @@
             '<td template repeat="{{}}" class="{{ val }}">{{ val }}</td>'
           '</tr>'
         '</tbody></table>');
-    var template = div.firstChild.firstChild.firstChild;
 
     var m = toObservable([
       [{ 'val': 0 }, { 'val': 1 }],
       [{ 'val': 2 }, { 'val': 3 }]
     ]);
 
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
 
       var i = 1;
@@ -1933,7 +1813,7 @@
           '<template repeat="{{}}" id=t1>'
             '<li>{{name}}'
               '<ul>'
-                '<template ref=t1 repeat="{{items}}"></template>'
+                '<template ref=t1 repaet="{{items}}"></template>'
               '</ul>'
             '</li>'
           '</template>'
@@ -1949,21 +1829,9 @@
         ]
       }
     ]);
-    var ul = div.firstChild;
-    var t = ul.firstChild;
 
-    templateBind(t).model = m;
-    return new Future(() {
-      expect(ul.nodes.length, 2);
-      var ul2 = ul.nodes[1].nodes[1];
-      expect(ul2.nodes.length, 2);
-      var ul3 = ul2.nodes[1].nodes[1];
-      expect(ul3.nodes.length, 1);
-
-      m.removeAt(0);
-    }).then(endOfMicrotask).then((_) {
-      expect(ul.nodes.length, 1);
-    });
+    recursivelySetTemplateModel(div, m);
+    return new Future(() => m.removeAt(0));
   });
 
   test('DeepNested', () {
@@ -1975,7 +1843,7 @@
           '</template>'
         '</p>'
       '</template>');
-    var template = div.firstChild;
+
     var m = toObservable({
       'a': {
         'b': {
@@ -1983,7 +1851,7 @@
         }
       }
     });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes[1].tagName, 'P');
       expect(div.nodes[1].nodes.first.tagName, 'TEMPLATE');
@@ -1993,10 +1861,9 @@
 
   test('TemplateContentRemoved', () {
     var div = createTestHtml('<template bind="{{}}">{{ }}</template>');
-    var template = div.firstChild;
     var model = 42;
 
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes[1].text, '42');
       expect(div.nodes[0].text, '');
@@ -2005,8 +1872,9 @@
 
   test('TemplateContentRemovedEmptyArray', () {
     var div = createTestHtml('<template iterate>Remove me</template>');
-    var template = div.firstChild;
-    templateBind(template).model = [];
+    var model = toObservable([]);
+
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes.length, 1);
       expect(div.nodes[0].text, '');
@@ -2021,12 +1889,12 @@
             '{{ b }}'
           '</template>'
         '</template>');
-    var template = div.firstChild;
+
     var model = toObservable({
       'a': 1,
       'b': 2
     });
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes[0].text, '');
       expect(div.nodes[1].text, '1');
@@ -2038,20 +1906,19 @@
   test('BindWithUndefinedModel', () {
     var div = createTestHtml(
         '<template bind="{{}}" if="{{}}">{{ a }}</template>');
-    var template = div.firstChild;
 
     var model = toObservable({'a': 42});
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes[1].text, '42');
 
       model = null;
-      templateBind(template).model = model;
+      recursivelySetTemplateModel(div, model);
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes.length, 1);
 
       model = toObservable({'a': 42});
-      templateBind(template).model = model;
+      recursivelySetTemplateModel(div, model);
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes[1].text, '42');
     });
@@ -2068,28 +1935,25 @@
             'Child: {{ name }}'
           '</template>'
         '</template>');
-    var template = div.firstChild;
+
     var m = toObservable({
       'name': 'Hermes',
       'wife': {
         'name': 'LaBarbara'
       }
     });
-    templateBind(template).model = m;
-
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 5);
       expect(div.nodes[1].text, 'Name: Hermes');
       expect(div.nodes[3].text, 'Wife: LaBarbara');
 
       m['child'] = toObservable({'name': 'Dwight'});
-
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes.length, 6);
       expect(div.nodes[5].text, 'Child: Dwight');
 
       m.remove('wife');
-
     }).then(endOfMicrotask).then((_) {
       expect(div.nodes.length, 5);
       expect(div.nodes[4].text, 'Child: Dwight');
@@ -2102,14 +1966,14 @@
           'Name: {{ name }}'
           '<template bind="{{friend}}" if="{{friend}}" ref="t"></template>'
         '</template>');
-    var template = div.firstChild;
+
     var m = toObservable({
       'name': 'Fry',
       'friend': {
         'name': 'Bender'
       }
     });
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 5);
       expect(div.nodes[1].text, 'Name: Fry');
@@ -2132,14 +1996,13 @@
         '<template repeat>{{ foo }}'
           '<template bind></template>'
         '</template>');
-    var template = div.firstChild;
 
     var m = toObservable([{ 'foo': 'bar' }]);
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
 
       m.add(toObservable({ 'foo': 'baz' }));
-      templateBind(template).model = m;
+      recursivelySetTemplateModel(div, m);
     }).then(endOfMicrotask).then((_) {
 
       expect(div.nodes.length, 5);
@@ -2152,10 +2015,9 @@
     if (!MutationObserver.supported) return null;
 
     var div = createTestHtml('<template repeat>{{ foo }}</template>');
-    var template = div.firstChild;
 
     var m = toObservable([{ 'foo': 'bar' }, { 'foo': 'bat'}]);
-    templateBind(template).model = m;
+    recursivelySetTemplateModel(div, m);
     var observer = new MutationObserver((x, y) {});
     return new Future(() {
       observer.observe(div, childList: true);
@@ -2176,35 +2038,13 @@
         '</template>');
 
     var m = toObservable({'foo': 'bar'});
-    templateBind(div.firstChild).model = m;
+    recursivelySetTemplateModel(div, m);
     return new Future(() {
       expect(div.nodes.length, 4);
       expect(div.nodes[3].text, 'bar');
     });
   });
 
-  test('baseURI', () {
-    // TODO(jmesserly): Dart's setInnerHtml breaks this test -- the template
-    // URL is created as blank despite the NullTreeSanitizer.
-    // Use JS interop as a workaround.
-    //var div = createTestHtml('<template bind>'
-    //   '<div style="background: url(foo.jpg)"></div></template>');
-    var div = new DivElement();
-    new JsObject.fromBrowserObject(div)['innerHTML'] = '<template bind>'
-        '<div style="background: url(foo.jpg)"></div></template>';
-    testDiv.append(div);
-    TemplateBindExtension.decorate(div.firstChild);
-
-    var local = document.createElement('div');
-    local.attributes['style'] = 'background: url(foo.jpg)';
-    div.append(local);
-    var template = div.firstChild;
-    templateBind(template).model = {};
-    return new Future(() {
-      expect(div.nodes[1].style.backgroundImage, local.style.backgroundImage);
-    });
-  });
-
   test('ChangeRefId', () {
     var div = createTestHtml(
         '<template id="a">a:{{ }}</template>'
@@ -2212,9 +2052,8 @@
         '<template repeat="{{}}">'
           '<template ref="a" bind="{{}}"></template>'
         '</template>');
-    var template = div.nodes[2];
     var model = toObservable([]);
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.nodes.length, 3);
 
@@ -2279,7 +2118,7 @@
     var root = createShadowTestHtml(
         '<template bind="{{}}">Hi {{ name }}</template>');
     var model = toObservable({'name': 'Leela'});
-    templateBind(root.firstChild).model = model;
+    recursivelySetTemplateModel(root, model);
     return new Future(() => expect(root.nodes[1].text, 'Hi Leela'));
   });
 
@@ -2305,12 +2144,8 @@
     if (!ShadowRoot.supported) return null;
     var root = createShadowTestHtml(
         '<template id=foo>Hi</template><template bind ref=foo></template>');
-    var template = root.nodes[1];
-    templateBind(template).model = toObservable({});
-    return new Future(() {
-      expect(root.nodes.length, 3);
-      clearAllTemplates(root);
-    });
+    recursivelySetTemplateModel(root, toObservable({}));
+    return new Future(() => expect(root.nodes.length, 3));
   });
 
   // https://github.com/Polymer/TemplateBinding/issues/8
@@ -2321,11 +2156,11 @@
           '{{ age }}'
         '</template>'
       '</template>');
-    var template = div.firstChild;
+
     var syntax = new UnbindingInNestedBindSyntax();
     var model = toObservable({'outer': {'inner': {'age': 42}}});
 
-    templateBind(template)..model = model..bindingDelegate = syntax;
+    recursivelySetTemplateModel(div, model, syntax);
 
     return new Future(() {
       expect(syntax.count, 1);
@@ -2350,8 +2185,7 @@
       '<template bind="{{}} {{}}">'
         '<template bind="{{}}">Foo</template>'
       '</template>');
-    var template = div.firstChild;
-    templateBind(template).model = null;
+    recursivelySetTemplateModel(div, null);
     return nextMicrotask;
   });
 
@@ -2365,10 +2199,15 @@
     var outer = templateBind(div.nodes.first);
     var model = toObservable({'b': {'foo': 'bar'}});
 
+    var host = new DivElement();
     var instance = outer.createInstance(model, new TestBindingSyntax());
-    expect(instance.firstChild.nextNode.text, 'bar:replaced');
+    expect(outer.content.nodes.first,
+        templateBind(instance.nodes.first).ref);
 
-    clearAllTemplates(instance);
+    host.append(instance);
+    return new Future(() {
+      expect(host.firstChild.nextNode.text, 'bar:replaced');
+    });
   });
 
   test('CreateInstance - sync error', () {
@@ -2485,41 +2324,19 @@
     });
   });
 
-  test('Accessor value retrieval count', () {
-    var div = createTestHtml(
-        '<template bind>{{ prop }}</template>');
-
-    var model = new TestAccessorModel();
-
-    templateBind(div.firstChild).model = model;
-
-    return new Future(() {
-      expect(model.count, 1);
-
-      model.value++;
-      // Dart note: we don't handle getters in @observable, so we need to
-      // notify regardless.
-      model.notifyPropertyChange(#prop, 1, model.value);
-
-    }).then(endOfMicrotask).then((_) {
-      expect(model.count, 2);
-    });
-  });
-
   test('issue-141', () {
     var div = createTestHtml(
         '<template bind>'
           '<div foo="{{foo1}} {{foo2}}" bar="{{bar}}"></div>'
         '</template>');
 
-    var template = div.firstChild;
     var model = toObservable({
       'foo1': 'foo1Value',
       'foo2': 'foo2Value',
       'bar': 'barValue'
     });
 
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       expect(div.lastChild.attributes['bar'], 'barValue');
     });
@@ -2533,10 +2350,9 @@
           '<div class="foo: {{ bar }}"></div>'
         '</template>');
 
-    var template = div.firstChild;
     var model = toObservable({'bar': 2});
 
-    templateBind(template)..model = model..bindingDelegate = delegate;
+    recursivelySetTemplateModel(div, model, delegate);
 
     return new Future(() {
       expect(div.lastChild.attributes['class'], 'foo: 2');
@@ -2544,17 +2360,12 @@
   });
 
   test('issue-152', () {
-    var div = createTestHtml(
-        '<template ref=notThere bind>XXX</template>');
-
+    var div = createTestHtml('<template ref=notThere></template>');
     var template = div.firstChild;
-    templateBind(template).model = {};
 
-    return new Future(() {
-      // if a ref cannot be located, a template will continue to use itself
-      // as the source of template instances.
-      expect(div.nodes[1].text, 'XXX');
-    });
+    // if a ref cannot be located, a template will continue to use itself
+    // as the source of template instances.
+    expect(template, templateBind(template).ref);
   });
 }
 
@@ -2568,7 +2379,6 @@
           '<input type="number" _value="{{ number }}">'
         '</template>');
 
-    var template = div.firstChild;
     var model = toObservable({
       'color': 'red',
       'url': 'pic.jpg',
@@ -2576,7 +2386,7 @@
       'number': 4
     });
 
-    templateBind(template).model = model;
+    recursivelySetTemplateModel(div, model);
     return new Future(() {
       var subDiv = div.firstChild.nextNode;
       expect(subDiv.attributes['style'], 'color: red;');
@@ -2630,14 +2440,3 @@
     return (model, _, oneTime) => new PathObserver(model, path);
   }
 }
-
-class TestAccessorModel extends Observable {
-  @observable var value = 1;
-  var count = 0;
-
-  @reflectable
-  get prop {
-    count++;
-    return value;
-  }
-}
diff --git a/pkg/template_binding/test/utils.dart b/pkg/template_binding/test/utils.dart
index 6cea4fe..d2d7379 100644
--- a/pkg/template_binding/test/utils.dart
+++ b/pkg/template_binding/test/utils.dart
@@ -105,11 +105,9 @@
   void sanitizeTree(Node node) {}
 }
 
-clearAllTemplates(node) {
-  if (isSemanticTemplate(node)) {
-    templateBind(node).clear();
-  }
+unbindAll(node) {
+  nodeBind(node).unbindAll();
   for (var child = node.firstChild; child != null; child = child.nextNode) {
-    clearAllTemplates(child);
+    unbindAll(child);
   }
 }
diff --git a/pkg/typed_mock/lib/typed_mock.dart b/pkg/typed_mock/lib/typed_mock.dart
index ab962d4..eb9ae73 100644
--- a/pkg/typed_mock/lib/typed_mock.dart
+++ b/pkg/typed_mock/lib/typed_mock.dart
@@ -364,8 +364,6 @@
 /// [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);
 }
@@ -374,7 +372,7 @@
 class _ArgumentMatcher_equals extends ArgumentMatcher {
   final expected;
 
-  const _ArgumentMatcher_equals(this.expected);
+  _ArgumentMatcher_equals(this.expected);
 
   @override
   bool matches(val) {
@@ -384,8 +382,6 @@
 
 
 class _ArgumentMatcher_anyBool extends ArgumentMatcher {
-  const _ArgumentMatcher_anyBool();
-
   @override
   bool matches(val) {
     return val is bool;
@@ -393,12 +389,10 @@
 }
 
 /// Matches any [bool] value.
-final anyBool = const _ArgumentMatcher_anyBool() as dynamic;
+final anyBool = new _ArgumentMatcher_anyBool() as dynamic;
 
 
 class _ArgumentMatcher_anyInt extends ArgumentMatcher {
-  const _ArgumentMatcher_anyInt();
-
   @override
   bool matches(val) {
     return val is int;
@@ -406,12 +400,10 @@
 }
 
 /// Matches any [int] value.
-final anyInt = const _ArgumentMatcher_anyInt() as dynamic;
+final anyInt = new _ArgumentMatcher_anyInt() as dynamic;
 
 
 class _ArgumentMatcher_anyObject extends ArgumentMatcher {
-  const _ArgumentMatcher_anyObject();
-
   @override
   bool matches(val) {
     return true;
@@ -419,12 +411,10 @@
 }
 
 /// Matches any [Object] (or subclass) value.
-final anyObject = const _ArgumentMatcher_anyObject() as dynamic;
+final anyObject = new _ArgumentMatcher_anyObject() as dynamic;
 
 
 class _ArgumentMatcher_anyString extends ArgumentMatcher {
-  const _ArgumentMatcher_anyString();
-
   @override
   bool matches(val) {
     return val is String;
@@ -432,4 +422,4 @@
 }
 
 /// Matches any [String] value.
-final anyString = const _ArgumentMatcher_anyString() as dynamic;
+final anyString = new _ArgumentMatcher_anyString() as dynamic;
diff --git a/pkg/typed_mock/pubspec.yaml b/pkg/typed_mock/pubspec.yaml
index 8e915a6..209860c 100644
--- a/pkg/typed_mock/pubspec.yaml
+++ b/pkg/typed_mock/pubspec.yaml
@@ -1,5 +1,5 @@
 name: typed_mock
-version: 0.0.3
+version: 0.0.2
 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/web_components/lib/build.log b/pkg/web_components/lib/build.log
index f88207b..2dfd8d5 100644
--- a/pkg/web_components/lib/build.log
+++ b/pkg/web_components/lib/build.log
@@ -1,39 +1,43 @@
 BUILD LOG
 ---------
-Build Time: 2014-05-21T18:37:28
+Build Time: 2014-04-01T15:17:50
 
 NODEJS INFORMATION
 ==================
-nodejs: v0.10.24
+nodejs: v0.10.26
 chai: 1.9.1
-grunt: 0.4.5
+grunt: 0.4.4
 grunt-audit: 0.0.3
 grunt-concat-sourcemap: 0.4.1
 grunt-contrib-concat: 0.4.0
-grunt-contrib-uglify: 0.4.0
+grunt-karma: 0.8.2
+grunt-contrib-uglify: 0.3.3
 grunt-contrib-yuidoc: 0.5.2
-grunt-karma: 0.8.3
-karma: 0.12.16
+karma: 0.12.2
 karma-crbot-reporter: 0.0.4
 karma-firefox-launcher: 0.1.3
-karma-ie-launcher: 0.1.5
-karma-mocha: 0.1.3
+karma-ie-launcher: 0.1.4
 karma-safari-launcher: 0.1.1
+mocha: 1.18.2
+karma-mocha: 0.1.3
 karma-script-launcher: 0.1.0
-mocha: 1.19.0
-Platform: 0.2.4
+Platform: 0.2.2
 
 REPO REVISIONS
 ==============
-CustomElements: 9cfef1fc323a9e9d4f5ff398750a6e4908bd47e3
-HTMLImports: 1ee73575c760350b9b670b5e414468ce6b94f529
-NodeBind: c47bc1b40d1cf0123b29620820a7111471e83ff3
-ShadowDOM: 9d2bdaa70a37df25e71abed658088cb117be7473
-TemplateBinding: 5b9a3be40682e1ccd5e6c0b04fbe2c54d74b5d1e
+CustomElements: 9b997ca97533147f5f17bd666c06e5fa1a13219e
+HTMLImports: 5f44b337ef6508271dd594f1ec086fac2be3cb0c
+NodeBind: b040e791f573b04cf06fdbc7d407712d46f4fca6
+PointerEvents: 86c341c7ef946dc295cb93a2b5ebebde69dbdcb7
+PointerGestures: e5ec43dcef5a20d789c7e4c09dd206cdb6664a27
+ShadowDOM: 4fe518f54bfdace322866822f9a5c99f41169a10
+TemplateBinding: 9dc4c42334b00716cec2826cb17dda6044c4aeb4
 WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
-observe-js: adccb62bd0b6915179671d567b224d60b7c7ff20
-platform-dev: 15e4e51efe8c8bb78b13ec345a1f705727b71474
+observe-js: 5db3ef588f3fdca7d44cdd24e3bf59b6d547b8c0
+platform: b4641125892409501e82ba3f44add15ab10be274
+polymer-expressions: 1749343a75fc3aa84d691f14c4582a6d1a7f39f1
+platform-dev: ccb7c307ee78d6694b4ca9e2422996f0cbe4a07c
 
 BUILD HASHES
 ============
-build/platform.js: aec8ca1ee3aab5e29f6fdf2518f5abad4f45ce21
\ No newline at end of file
+build/platform.js: 8edd41e9de6172d38ace4a17f2aad8ec0556abd8
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index be0db90..9fa19b5 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -1,71 +1,3 @@
-/**
- * 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
- */
-
-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);
-
 /*
  * Copyright 2012 The Polymer Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
@@ -164,9 +96,12 @@
   var hasObserve = detectObjectObserve();
 
   function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
+    // 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;
     }
 
@@ -314,7 +249,7 @@
           obj = obj[this[i - 1]];
         if (!isObject(obj))
           return;
-        observe(obj, this[0]);
+        observe(obj);
       }
     },
 
@@ -503,28 +438,6 @@
     };
   }
 
-  /*
-   * The observedSet abstraction is a perf optimization which reduces the total
-   * number of Object.observe observations of a set of objects. The idea is that
-   * groups of Observers will have some object dependencies in common and this
-   * observed set ensures that each object in the transitive closure of
-   * dependencies is only observed once. The observedSet acts as a write barrier
-   * such that whenever any change comes through, all Observers are checked for
-   * changed values.
-   *
-   * Note that this optimization is explicitly moving work from setup-time to
-   * change-time.
-   *
-   * TODO(rafaelw): Implement "garbage collection". In order to move work off
-   * the critical path, when Observers are closed, their observed objects are
-   * not Object.unobserve(d). As a result, it's possible that if the observedSet
-   * is kept open, but some Observers have been closed, it could cause "leaks"
-   * (prevent otherwise collectable objects from being collected). At some
-   * point, we should implement incremental "gc" which keeps a list of
-   * observedSets which may need clean-up and does small amounts of cleanup on a
-   * timeout until all is clean.
-   */
-
   function getObservedObject(observer, object, arrayObserve) {
     var dir = observedObjectCache.pop() || newObservedObject();
     dir.open(observer);
@@ -532,80 +445,106 @@
     return dir;
   }
 
+  var emptyArray = [];
   var observedSetCache = [];
 
   function newObservedSet() {
-    var observerCount = 0;
     var observers = [];
+    var observerCount = 0;
     var objects = [];
-    var rootObj;
-    var rootObjProps;
+    var toRemove = emptyArray;
+    var resetNeeded = false;
+    var resetScheduled = false;
 
-    function observe(obj, prop) {
+    function observe(obj) {
       if (!obj)
         return;
 
-      if (obj === rootObj)
-        rootObjProps[prop] = true;
-
-      if (objects.indexOf(obj) < 0) {
+      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), prop);
+      observe(Object.getPrototypeOf(obj));
     }
 
-    function allRootObjNonObservedProps(recs) {
-      for (var i = 0; i < recs.length; i++) {
-        var rec = recs[i];
-        if (rec.object !== rootObj ||
-            rootObjProps[rec.name] ||
-            rec.type === 'setPrototype') {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    function callback(recs) {
-      if (allRootObjNonObservedProps(recs))
-        return;
+    function reset() {
+      var objs = toRemove === emptyArray ? [] : toRemove;
+      toRemove = objects;
+      objects = objs;
 
       var observer;
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.iterateObjects_(observe);
-        }
+      for (var id in observers) {
+        observer = observers[id];
+        if (!observer || observer.state_ != OPENED)
+          continue;
+
+        observer.iterateObjects_(observe);
       }
 
-      for (var i = 0; i < observers.length; i++) {
-        observer = observers[i];
-        if (observer.state_ == OPENED) {
-          observer.check_();
-        }
+      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, object) {
-        if (!rootObj) {
-          rootObj = object;
-          rootObjProps = {};
-        }
-
-        observers.push(obs);
+      open: function(obs) {
+        observers[obs.id_] = obs;
         observerCount++;
         obs.iterateObjects_(observe);
       },
       close: function(obs) {
+        var anyLeft = false;
+
+        observers[obs.id_] = undefined;
         observerCount--;
-        if (observerCount > 0) {
+
+        if (observerCount) {
+          scheduleReset();
           return;
         }
+        resetNeeded = false;
 
         for (var i = 0; i < objects.length; i++) {
           Object.unobserve(objects[i], callback);
@@ -614,10 +553,9 @@
 
         observers.length = 0;
         objects.length = 0;
-        rootObj = undefined;
-        rootObjProps = undefined;
         observedSetCache.push(this);
-      }
+      },
+      reset: scheduleReset
     };
 
     return record;
@@ -630,7 +568,7 @@
       lastObservedSet = observedSetCache.pop() || newObservedSet();
       lastObservedSet.object = obj;
     }
-    lastObservedSet.open(observer, obj);
+    lastObservedSet.open(observer);
     return lastObservedSet;
   }
 
@@ -658,8 +596,8 @@
       addToAll(this);
       this.callback_ = callback;
       this.target_ = target;
-      this.connect_();
       this.state_ = OPENED;
+      this.connect_();
       return this.value_;
     },
 
@@ -668,11 +606,11 @@
         return;
 
       removeFromAll(this);
+      this.state_ = CLOSED;
       this.disconnect_();
       this.value_ = undefined;
       this.callback_ = undefined;
       this.target_ = undefined;
-      this.state_ = CLOSED;
     },
 
     deliver: function() {
@@ -928,7 +866,7 @@
     Observer.call(this);
 
     this.object_ = object;
-    this.path_ = getPath(path);
+    this.path_ = path instanceof Path ? path : getPath(path);
     this.directObserver_ = undefined;
   }
 
@@ -971,10 +909,9 @@
     }
   });
 
-  function CompoundObserver(reportChangesOnOpen) {
+  function CompoundObserver() {
     Observer.call(this);
 
-    this.reportChangesOnOpen_ = reportChangesOnOpen;
     this.value_ = [];
     this.directObserver_ = undefined;
     this.observed_ = [];
@@ -986,59 +923,67 @@
     __proto__: Observer.prototype,
 
     connect_: function() {
-      if (hasObserve) {
-        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;
-          }
-        }
+      this.check_(undefined, true);
 
-        if (needsDirectObserver)
-          this.directObserver_ = getObservedSet(this, object);
+      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;
+        }
       }
 
-      this.check_(undefined, !this.reportChangesOnOpen_);
+      if (this.directObserver_) {
+        if (needsDirectObserver) {
+          this.directObserver_.reset();
+          return;
+        }
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+        return;
+      }
+
+      if (needsDirectObserver)
+        this.directObserver_ = getObservedSet(this, object);
     },
 
-    disconnect_: function() {
+    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;
-      this.value_.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.');
 
-      var path = getPath(path);
-      this.observed_.push(object, path);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = path.getValueFrom(object);
+      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);
-      if (!this.reportChangesOnOpen_)
-        return;
-      var index = this.observed_.length / 2 - 1;
-      this.value_[index] = observer.open(this.deliver, this);
     },
 
     startReset: function() {
@@ -1046,7 +991,7 @@
         throw Error('Can only reset while open');
 
       this.state_ = RESETTING;
-      this.disconnect_();
+      this.closeObservers_();
     },
 
     finishReset: function() {
@@ -1070,17 +1015,11 @@
     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 path = this.observed_[i+1];
-        var value;
-        if (object === observerSentinel) {
-          var observable = path;
-          value = this.state_ === UNOPENED ?
-              observable.open(this.deliver, this) :
-              observable.discardChanges();
-        } else {
-          value = path.getValueFrom(object);
-        }
+        var value = object === observerSentinel ?
+            pathOrObserver.discardChanges() :
+            pathOrObserver.getValueFrom(object)
 
         if (skipChanges) {
           this.value_[i / 2] = value;
@@ -1171,94 +1110,51 @@
     delete: true
   };
 
- var updateRecord = {
-    object: undefined,
-    type: 'update',
-    name: undefined,
-    oldValue: undefined
-  };
-
-  function notify(object, name, value, oldValue) {
-    if (areSameValue(value, oldValue))
+  function notifyFunction(object, name) {
+    if (typeof Object.observe !== 'function')
       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);
+    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.createBindablePrototypeAccessor = function(proto, name) {
-    var privateName = name + '_';
-    var privateObservable  = name + 'Observable_';
+  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);
+    });
 
-    proto[privateName] = proto[name];
-
-    Object.defineProperty(proto, name, {
+    Object.defineProperty(target, 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);
-
+        observable.deliver();
         return value;
       },
+      set: function(newValue) {
+        observable.setValue(newValue);
+        return newValue;
+      },
       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;
+        Object.defineProperty(target, name, {
+          value: value,
+          writable: true,
+          configurable: true
+        });
       }
     };
   }
@@ -1720,7 +1616,6 @@
 
   global.Observer = Observer;
   global.Observer.runEOM_ = runEOM;
-  global.Observer.observerSentinel_ = observerSentinel; // for testing.
   global.Observer.hasObjectObserve = hasObserve;
   global.ArrayObserver = ArrayObserver;
   global.ArrayObserver.calculateSplices = function(current, previous) {
@@ -1735,6 +1630,66 @@
   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) {

 
@@ -1751,23 +1706,20 @@
   var nativePrototypeTable = new WeakMap();
   var wrappers = Object.create(null);
 
-  function detectEval() {
-    // Don't test for eval if we're running in a Chrome App environment.
-    // We check for APIs set that only exist in a Chrome App context.
-    if (typeof chrome !== 'undefined' && chrome.app && chrome.app.runtime) {
-      return false;
-    }
-
+  // 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;');
-      return f();
+      var f = new Function('', 'return true;');
+      hasEval = f();
     } catch (ex) {
-      return false;
+      hasEval = false;
     }
   }
 
-  var hasEval = detectEval();
-
   function assert(b) {
     if (!b)
       throw new Error('Assertion failed');
@@ -1778,18 +1730,14 @@
   var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
 
   function mixin(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
+    getOwnPropertyNames(from).forEach(function(name) {
       defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
+    });
     return to;
   };
 
   function mixinStatics(to, from) {
-    var names = getOwnPropertyNames(from);
-    for (var i = 0; i < names.length; i++) {
-      var name = names[i];
+    getOwnPropertyNames(from).forEach(function(name) {
       switch (name) {
         case 'arguments':
         case 'caller':
@@ -1797,10 +1745,10 @@
         case 'name':
         case 'prototype':
         case 'toString':
-          continue;
+          return;
       }
       defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    }
+    });
     return to;
   };
 
@@ -1811,18 +1759,6 @@
     }
   }
 
-  var nonEnumerableDataDescriptor = {
-    value: undefined,
-    configurable: true,
-    enumerable: false,
-    writable: true
-  };
-
-  function defineNonEnumerableDataProperty(object, name, value) {
-    nonEnumerableDataDescriptor.value = value;
-    defineProperty(object, name, nonEnumerableDataDescriptor);
-  }
-
   // 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.
@@ -1967,9 +1903,12 @@
     addForwardingProperties(nativePrototype, wrapperPrototype);
     if (opt_instance)
       registerInstanceProperties(wrapperPrototype, opt_instance);
-
-    defineNonEnumerableDataProperty(
-        wrapperPrototype, 'constructor', wrapperConstructor);
+    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;
   }
@@ -2099,15 +2038,12 @@
     node.polymerWrapper_ = wrapper;
   }
 
-  var getterDescriptor = {
-    get: undefined,
-    configurable: true,
-    enumerable: true
-  };
-
   function defineGetter(constructor, name, getter) {
-    getterDescriptor.get = getter;
-    defineProperty(constructor.prototype, name, getterDescriptor);
+    defineProperty(constructor.prototype, name, {
+      get: getter,
+      configurable: true,
+      enumerable: true
+    });
   }
 
   function defineWrapGetter(constructor, name) {
@@ -2591,21 +2527,10 @@
    * 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.
-   *
-   * The root is a Node that has no parent.
-   *
-   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of
-   * the host of the ShadowRoot.
-   *
-   * @param {!Node} root
-   * @param {TreeScope} parent
    * @constructor
    */
   function TreeScope(root, parent) {
-    /** @type {!Node} */
     this.root = root;
-
-    /** @type {TreeScope} */
     this.parent = parent;
   }
 
@@ -2639,10 +2564,6 @@
   }
 
   function getTreeScope(node) {
-    if (node instanceof scope.wrappers.Window) {
-      debugger;
-    }
-
     if (node.treeScope_)
       return node.treeScope_;
     var parent = node.parentNode;
@@ -2692,323 +2613,244 @@
     return node instanceof wrappers.ShadowRoot;
   }
 
-  function rootOfNode(node) {
-    return getTreeScope(node).root;
+  function isInsertionPoint(node) {
+    var localName = node.localName;
+    return localName === 'content' || localName === 'shadow';
   }
 
-  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths
-  function getEventPath(node, event) {
-    var path = [];
-    var current = node;
-    path.push(current);
-    while (current) {
-      // 4.1.
-      var destinationInsertionPoints = getDestinationInsertionPoints(current);
-      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {
-        // 4.1.1
-        for (var i = 0; i < destinationInsertionPoints.length; i++) {
-          var insertionPoint = destinationInsertionPoints[i];
-          // 4.1.1.1
-          if (isShadowInsertionPoint(insertionPoint)) {
-            var shadowRoot = rootOfNode(insertionPoint);
-            // 4.1.1.1.2
-            var olderShadowRoot = shadowRoot.olderShadowRoot;
-            if (olderShadowRoot)
-              path.push(olderShadowRoot);
-          }
+  function isShadowHost(node) {
+    return !!node.shadowRoot;
+  }
 
-          // 4.1.1.2
-          path.push(insertionPoint);
-        }
+  function getEventParent(node) {
+    var dv;
+    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;
+  }
 
-        // 4.1.2
-        current = destinationInsertionPoints[
-            destinationInsertionPoints.length - 1];
+  // 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();
 
-      // 4.2
-      } else {
-        if (isShadowRoot(current)) {
-          if (inSameTree(node, current) && eventMustBeStopped(event)) {
-            // Stop this algorithm
-            break;
-          }
-          current = current.host;
-          path.push(current);
+    // 1.
+    if (isShadowRoot(node))
+      return getInsertionParent(node) || node.host;
 
-        // 4.2.2
-        } else {
-          current = current.parentNode;
-          if (current)
-            path.push(current);
+    // 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 path;
+    return getEventParent(node);
   }
 
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped
-  function eventMustBeStopped(event) {
-    if (!event)
-      return false;
-
-    switch (event.type) {
-      case 'abort':
-      case 'error':
-      case 'select':
-      case 'change':
-      case 'load':
-      case 'reset':
-      case 'resize':
-      case 'scroll':
-      case 'selectstart':
-        return true;
-    }
-    return false;
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point
-  function isShadowInsertionPoint(node) {
-    return node instanceof HTMLShadowElement;
-    // and make sure that there are no shadow precing this?
-    // and that there is no content ancestor?
-  }
-
-  function getDestinationInsertionPoints(node) {
-    return scope.getDestinationInsertionPoints(node);
-  }
-
-  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting
-  function eventRetargetting(path, currentTarget) {
-    if (path.length === 0)
-      return currentTarget;
-
-    // The currentTarget might be the window object. Use its document for the
-    // purpose of finding the retargetted node.
-    if (currentTarget instanceof wrappers.Window)
-      currentTarget = currentTarget.document;
-
-    var currentTargetTree = getTreeScope(currentTarget);
-    var originalTarget = path[0];
-    var originalTargetTree = getTreeScope(originalTarget);
-    var relativeTargetTree =
-        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);
-
-    for (var i = 0; i < path.length; i++) {
-      var node = path[i];
-      if (getTreeScope(node) === relativeTargetTree)
-        return node;
-    }
-
-    return path[path.length - 1];
-  }
-
-  function getTreeScopeAncestors(treeScope) {
+  // 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 = [];
-    for (;treeScope; treeScope = treeScope.parent) {
-      ancestors.push(treeScope);
-    }
-    return ancestors;
-  }
-
-  function lowestCommonInclusiveAncestor(tsA, tsB) {
-    var ancestorsA = getTreeScopeAncestors(tsA);
-    var ancestorsB = getTreeScopeAncestors(tsB);
-
-    var result = null;
-    while (ancestorsA.length > 0 && ancestorsB.length > 0) {
-      var a = ancestorsA.pop();
-      var b = ancestorsB.pop();
-      if (a === b)
-        result = a;
-      else
-        break;
-    }
-    return result;
-  }
-
-  function getTreeScopeRoot(ts) {
-    if (!ts.parent)
-      return ts;
-    return getTreeScopeRoot(ts.parent);
-  }
-
-  function relatedTargetResolution(event, currentTarget, relatedTarget) {
-    // In case the current target is a window use its document for the purpose
-    // of retargetting the related target.
-    if (currentTarget instanceof wrappers.Window)
-      currentTarget = currentTarget.document;
-
-    var currentTargetTree = getTreeScope(currentTarget);
-    var relatedTargetTree = getTreeScope(relatedTarget);
-
-    var relatedTargetEventPath = getEventPath(relatedTarget, event);
-
-    var lowestCommonAncestorTree;
-
-    // 4
-    var lowestCommonAncestorTree =
-        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);
-
-    // 5
-    if (!lowestCommonAncestorTree)
-      lowestCommonAncestorTree = relatedTargetTree.root;
-
-    // 6
-    for (var commonAncestorTree = lowestCommonAncestorTree;
-         commonAncestorTree;
-         commonAncestorTree = commonAncestorTree.parent) {
-      // 6.1
-      var adjustedRelatedTarget;
-      for (var i = 0; i < relatedTargetEventPath.length; i++) {
-        var node = relatedTargetEventPath[i];
-        if (getTreeScope(node) === commonAncestorTree)
-          return node;
+    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);
   }
 
-  var NONE = 0;
-  var CAPTURING_PHASE = 1;
-  var AT_TARGET = 2;
-  var BUBBLING_PHASE = 3;
-
-  // pendingError is used to rethrow the first error we got during an event
-  // dispatch. The browser actually reports all errors but to do that we would
-  // need to rethrow the error asynchronously.
-  var pendingError;
-
   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));
-    if (pendingError) {
-      var err = pendingError;
-      pendingError = null;
-      throw err;
+  }
+
+  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');
-
+      throw new Error('InvalidStateError')
     currentlyDispatchingEvents.set(event, true);
 
     // Render to ensure that the event path is correct.
     scope.renderAllPending();
-    var eventPath;
+    var eventPath = retarget(originalWrapperTarget);
 
-    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object
-    // All events dispatched on Nodes with a default view, except load events,
-    // should propagate to the Window.
-
+    // 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
-    var overrideTarget;
-    var win;
-    var type = event.type;
-
-    // Should really be not cancelable too but since Firefox has a bug there
-    // we skip that check.
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456
-    if (type === 'load' && !event.bubbles) {
-      var doc = originalWrapperTarget;
-      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {
-        overrideTarget = doc;
-        eventPath = [];
-      }
-    }
-
-    if (!eventPath) {
-      if (originalWrapperTarget instanceof wrappers.Window) {
-        win = originalWrapperTarget;
-        eventPath = [];
-      } else {
-        eventPath = getEventPath(originalWrapperTarget, event);
-
-        if (event.type !== 'load') {
-          var doc = eventPath[eventPath.length - 1];
-          if (doc instanceof wrappers.Document)
-            win = doc.defaultView;
-        }
-      }
+    //
+    // 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, win, overrideTarget)) {
-      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {
-        dispatchBubbling(event, eventPath, win, overrideTarget);
+    if (dispatchCapturing(event, eventPath)) {
+      if (dispatchAtTarget(event, eventPath)) {
+        dispatchBubbling(event, eventPath);
       }
     }
 
-    eventPhaseTable.set(event, NONE);
+    eventPhaseTable.set(event, Event.NONE);
     currentTargetTable.delete(event, null);
     currentlyDispatchingEvents.delete(event);
 
     return event.defaultPrevented;
   }
 
-  function dispatchCapturing(event, eventPath, win, overrideTarget) {
-    var phase = CAPTURING_PHASE;
-
-    if (win) {
-      if (!invoke(win, event, phase, eventPath, overrideTarget))
-        return false;
-    }
+  function dispatchCapturing(event, eventPath) {
+    var phase;
 
     for (var i = eventPath.length - 1; i > 0; i--) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))
+      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, win, overrideTarget) {
-    var phase = AT_TARGET;
-    var currentTarget = eventPath[0] || win;
-    return invoke(currentTarget, event, phase, eventPath, overrideTarget);
+  function dispatchAtTarget(event, eventPath) {
+    var phase = Event.AT_TARGET;
+    return invoke(eventPath[0], event, phase);
   }
 
-  function dispatchBubbling(event, eventPath, win, overrideTarget) {
-    var phase = BUBBLING_PHASE;
+  function dispatchBubbling(event, eventPath) {
+    var bubbles = event.bubbles;
+    var phase;
+
     for (var i = 1; i < eventPath.length; i++) {
-      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))
+      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;
     }
-
-    if (win && eventPath.length > 0) {
-      invoke(win, event, phase, eventPath, overrideTarget);
-    }
   }
 
-  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {
+  function invoke(tuple, event, phase) {
+    var target = tuple.target;
+    var currentTarget = tuple.currentTarget;
+
     var listeners = listenersTable.get(currentTarget);
     if (!listeners)
       return true;
 
-    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);
-
-    if (target === currentTarget) {
-      if (phase === CAPTURING_PHASE)
-        return true;
-
-      if (phase === BUBBLING_PHASE)
-         phase = AT_TARGET;
-
-    } else if (phase === BUBBLING_PHASE && !event.bubbles) {
-      return true;
-    }
-
     if ('relatedTarget' in event) {
       var originalEvent = unwrap(event);
       var unwrappedRelatedTarget = originalEvent.relatedTarget;
@@ -3025,8 +2867,7 @@
             unwrappedRelatedTarget.addEventListener) {
           var relatedTarget = wrap(unwrappedRelatedTarget);
 
-          var adjusted =
-              relatedTargetResolution(event, currentTarget, relatedTarget);
+          var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);
           if (adjusted === target)
             return true;
         } else {
@@ -3040,7 +2881,6 @@
     var type = event.type;
 
     var anyRemoved = false;
-    // targetTable.set(event, target);
     targetTable.set(event, target);
     currentTargetTable.set(event, currentTarget);
 
@@ -3052,8 +2892,8 @@
       }
 
       if (listener.type !== type ||
-          !listener.capture && phase === CAPTURING_PHASE ||
-          listener.capture && phase === BUBBLING_PHASE) {
+          !listener.capture && phase === Event.CAPTURING_PHASE ||
+          listener.capture && phase === Event.BUBBLING_PHASE) {
         continue;
       }
 
@@ -3067,8 +2907,10 @@
           return false;
 
       } catch (ex) {
-        if (!pendingError)
-          pendingError = ex;
+        if (window.onerror)
+          window.onerror(ex.message);
+        else
+          console.error(ex, ex.stack);
       }
     }
 
@@ -3145,7 +2987,7 @@
         var baseRoot = getTreeScope(currentTargetTable.get(this));
 
         for (var i = 0; i <= lastIndex; i++) {
-          var currentTarget = eventPath[i];
+          var currentTarget = eventPath[i].currentTarget;
           var currentRoot = getTreeScope(currentTarget);
           if (currentRoot.contains(baseRoot) &&
               // Make sure we do not add Window to the path.
@@ -3488,10 +3330,13 @@
     scope.renderAllPending();
 
     var element = wrap(originalElementFromPoint.call(document.impl, x, y));
-    if (!element)
-      return null;
-    var path = getEventPath(element, null);
-    return eventRetargetting(path, self);
+    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;
   }
 
   /**
@@ -3545,6 +3390,7 @@
     };
   }
 
+  scope.adjustRelatedTarget = adjustRelatedTarget;
   scope.elementFromPoint = elementFromPoint;
   scope.getEventHandlerGetter = getEventHandlerGetter;
   scope.getEventHandlerSetter = getEventHandlerSetter;
@@ -3559,132 +3405,6 @@
 
 })(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 UIEvent = scope.wrappers.UIEvent;
-  var mixin = scope.mixin;
-  var registerWrapper = scope.registerWrapper;
-  var unwrap = scope.unwrap;
-  var wrap = scope.wrap;
-
-  // TouchEvent is WebKit/Blink only.
-  var OriginalTouchEvent = window.TouchEvent;
-  if (!OriginalTouchEvent)
-    return;
-
-  var nativeEvent;
-  try {
-    nativeEvent = document.createEvent('TouchEvent');
-  } catch (ex) {
-    // In Chrome creating a TouchEvent fails if the feature is not turned on
-    // which it isn't on desktop Chrome.
-    return;
-  }
-
-  var nonEnumDescriptor = {enumerable: false};
-
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
-  }
-
-  function Touch(impl) {
-    this.impl = impl;
-  }
-
-  Touch.prototype = {
-    get target() {
-      return wrap(this.impl.target);
-    }
-  };
-
-  var descr = {
-    configurable: true,
-    enumerable: true,
-    get: null
-  };
-
-  [
-    'clientX',
-    'clientY',
-    'screenX',
-    'screenY',
-    'pageX',
-    'pageY',
-    'identifier',
-    'webkitRadiusX',
-    'webkitRadiusY',
-    'webkitRotationAngle',
-    'webkitForce'
-  ].forEach(function(name) {
-    descr.get = function() {
-      return this.impl[name];
-    };
-    Object.defineProperty(Touch.prototype, name, descr);
-  });
-
-  function TouchList() {
-    this.length = 0;
-    nonEnum(this, 'length');
-  }
-
-  TouchList.prototype = {
-    item: function(index) {
-      return this[index];
-    }
-  };
-
-  function wrapTouchList(nativeTouchList) {
-    var list = new TouchList();
-    for (var i = 0; i < nativeTouchList.length; i++) {
-      list[i] = new Touch(nativeTouchList[i]);
-    }
-    list.length = i;
-    return list;
-  }
-
-  function TouchEvent(impl) {
-    UIEvent.call(this, impl);
-  }
-
-  TouchEvent.prototype = Object.create(UIEvent.prototype);
-
-  mixin(TouchEvent.prototype, {
-    get touches() {
-      return wrapTouchList(unwrap(this).touches);
-    },
-
-    get targetTouches() {
-      return wrapTouchList(unwrap(this).targetTouches);
-    },
-
-    get changedTouches() {
-      return wrapTouchList(unwrap(this).changedTouches);
-    },
-
-    initTouchEvent: function() {
-      // The only way to use this is to reuse the TouchList from an existing
-      // TouchEvent. Since this is WebKit/Blink proprietary API we will not
-      // implement this until someone screams.
-      throw new Error('Not implemented');
-    }
-  });
-
-  registerWrapper(OriginalTouchEvent, TouchEvent, nativeEvent);
-
-  scope.wrappers.Touch = Touch;
-  scope.wrappers.TouchEvent = TouchEvent;
-  scope.wrappers.TouchList = TouchList;
-
-})(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.
@@ -3694,10 +3414,8 @@
 
   var wrap = scope.wrap;
 
-  var nonEnumDescriptor = {enumerable: false};
-
   function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, nonEnumDescriptor);
+    Object.defineProperty(obj, prop, {enumerable: false});
   }
 
   function NodeList() {
@@ -4153,11 +3871,8 @@
       } else {
         if (!previousNode)
           this.firstChild_ = nodes[0];
-        if (!refWrapper) {
+        if (!refWrapper)
           this.lastChild_ = nodes[nodes.length - 1];
-          if (this.firstChild_ === undefined)
-            this.firstChild_ = this.firstChild;
-        }
 
         var parentNode = refNode ? refNode.parentNode : this.impl;
 
@@ -4493,9 +4208,6 @@
 (function(scope) {
   'use strict';
 
-  var HTMLCollection = scope.wrappers.HTMLCollection;
-  var NodeList = scope.wrappers.NodeList;
-
   function findOne(node, selector) {
     var m, el = node.firstElementChild;
     while (el) {
@@ -4509,43 +4221,15 @@
     return null;
   }
 
-  function matchesSelector(el, selector) {
-    return el.matches(selector);
-  }
-
-  var XHTML_NS = 'http://www.w3.org/1999/xhtml';
-
-  function matchesTagName(el, localName, localNameLowerCase) {
-    var ln = el.localName;
-    return ln === localName ||
-        ln === localNameLowerCase && el.namespaceURI === XHTML_NS;
-  }
-
-  function matchesEveryThing() {
-    return true;
-  }
-
-  function matchesLocalName(el, localName) {
-    return el.localName === localName;
-  }
-
-  function matchesNameSpace(el, ns) {
-    return el.namespaceURI === ns;
-  }
-
-  function matchesLocalNameNS(el, ns, localName) {
-    return el.namespaceURI === ns && el.localName === localName;
-  }
-
-  function findElements(node, result, p, arg0, arg1) {
+  function findAll(node, selector, results) {
     var el = node.firstElementChild;
     while (el) {
-      if (p(el, arg0, arg1))
-        result[result.length++] = el;
-      findElements(el, result, p, arg0, arg1);
+      if (el.matches(selector))
+        results[results.length++] = el;
+      findAll(el, selector, results);
       el = el.nextElementSibling;
     }
-    return result;
+    return results;
   }
 
   // find and findAll will only match Simple Selectors,
@@ -4557,42 +4241,32 @@
       return findOne(this, selector);
     },
     querySelectorAll: function(selector) {
-      return findElements(this, new NodeList(), matchesSelector, selector);
+      return findAll(this, selector, new NodeList())
     }
   };
 
   var GetElementsByInterface = {
-    getElementsByTagName: function(localName) {
-      var result = new HTMLCollection();
-      if (localName === '*')
-        return findElements(this, result, matchesEveryThing);
-
-      return findElements(this, result,
-          matchesTagName,
-          localName,
-          localName.toLowerCase());
+    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);
 
-    getElementsByTagNameNS: function(ns, localName) {
-      var result = new HTMLCollection();
-
-      if (ns === '') {
-        ns = null;
-      } else if (ns === '*') {
-        if (localName === '*')
-          return findElements(this, result, matchesEveryThing);
-        return findElements(this, result, matchesLocalName, localName);
+      // 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];
       }
-
-      if (localName === '*')
-        return findElements(this, result, matchesNameSpace, ns);
-
-      return findElements(this, result, matchesLocalNameNS, ns, localName);
+      result.length = j;
+      return result;
     }
   };
 
@@ -4841,8 +4515,6 @@
       return this.impl.polymerShadowRoot_ || null;
     },
 
-    // getDestinationInsertionPoints added in ShadowRenderer.js
-
     setAttribute: function(name, value) {
       var oldValue = this.impl.getAttribute(name);
       this.impl.setAttribute(name, value);
@@ -5291,6 +4963,8 @@
     }
 
     // getDistributedNodes is added in ShadowRenderer
+
+    // TODO: attribute boolean resetStyleInheritance;
   });
 
   if (OriginalHTMLContentElement)
@@ -5352,7 +5026,6 @@
 
   var HTMLElement = scope.wrappers.HTMLElement;
   var mixin = scope.mixin;
-  var NodeList = scope.wrappers.NodeList;
   var registerWrapper = scope.registerWrapper;
 
   var OriginalHTMLShadowElement = window.HTMLShadowElement;
@@ -5361,8 +5034,9 @@
     HTMLElement.call(this, node);
   }
   HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-
-  // getDistributedNodes is added in ShadowRenderer
+  mixin(HTMLShadowElement.prototype, {
+    // TODO: attribute boolean resetStyleInheritance;
+  });
 
   if (OriginalHTMLShadowElement)
     registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
@@ -6170,12 +5844,11 @@
     // DocumentFragment instance. Override that.
     rewrap(node, this);
 
+    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));
+
     var oldShadowRoot = hostWrapper.shadowRoot;
     nextOlderShadowTreeTable.set(this, oldShadowRoot);
 
-    this.treeScope_ =
-        new TreeScope(this, getTreeScope(oldShadowRoot || hostWrapper));
-
     shadowHostTable.set(this, hostWrapper);
   }
   ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
@@ -6314,18 +5987,29 @@
     parentNode.removeChild(node);
   }
 
-  var distributedNodesTable = new WeakMap();
-  var destinationInsertionPointsTable = new WeakMap();
+  var distributedChildNodesTable = new WeakMap();
+  var eventParentsTable = new WeakMap();
+  var insertionParentTable = new WeakMap();
   var rendererForHostTable = new WeakMap();
 
-  function resetDistributedNodes(insertionPoint) {
-    distributedNodesTable.set(insertionPoint, []);
+  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 getDistributedNodes(insertionPoint) {
-    var rv = distributedNodesTable.get(insertionPoint);
+  function resetDistributedChildNodes(insertionPoint) {
+    distributedChildNodesTable.set(insertionPoint, []);
+  }
+
+  function getDistributedChildNodes(insertionPoint) {
+    var rv = distributedChildNodesTable.get(insertionPoint);
     if (!rv)
-      distributedNodesTable.set(insertionPoint, rv = []);
+      distributedChildNodesTable.set(insertionPoint, rv = []);
     return rv;
   }
 
@@ -6337,6 +6021,92 @@
     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',
@@ -6481,14 +6251,19 @@
         return;
 
       this.invalidateAttributes();
+      this.treeComposition();
 
       var host = this.host;
+      var shadowRoot = host.shadowRoot;
 
-      this.distribution(host);
+      this.associateNode(host);
+      var topMostRenderer = !renderNode;
       var renderNode = opt_renderNode || new RenderNode(host);
-      this.buildRenderTree(renderNode, host);
 
-      var topMostRenderer = !opt_renderNode;
+      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {
+        this.renderNode(shadowRoot, renderNode, node, false);
+      }
+
       if (topMostRenderer)
         renderNode.sync();
 
@@ -6509,154 +6284,77 @@
       }
     },
 
-    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms
-    distribution: function(root) {
-      this.resetAll(root);
-      this.distributionResolution(root);
-    },
-
-    resetAll: function(node) {
-      if (isInsertionPoint(node))
-        resetDistributedNodes(node);
-      else
-        resetDestinationInsertionPoints(node);
-
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.resetAll(child);
-      }
-
-      if (node.shadowRoot)
-        this.resetAll(node.shadowRoot);
-
-      if (node.olderShadowRoot)
-        this.resetAll(node.olderShadowRoot);
-    },
-
-    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results
-    distributionResolution: function(node) {
+    renderNode: function(shadowRoot, renderNode, node, isNested) {
       if (isShadowHost(node)) {
-        var shadowHost = node;
-        // 1.1
-        var pool = poolPopulation(shadowHost);
-
-        var shadowTrees = getShadowTrees(shadowHost);
-
-        // 1.2
-        for (var i = 0; i < shadowTrees.length; i++) {
-          // 1.2.1
-          this.poolDistribution(shadowTrees[i], pool);
-        }
-
-        // 1.3
-        for (var i = shadowTrees.length - 1; i >= 0; i--) {
-          var shadowTree = shadowTrees[i];
-
-          // 1.3.1
-          // TODO(arv): We should keep the shadow insertion points on the
-          // shadow root (or renderer) so we don't have to search the tree
-          // every time.
-          var shadow = getShadowInsertionPoint(shadowTree);
-
-          // 1.3.2
-          if (shadow) {
-
-            // 1.3.2.1
-            var olderShadowRoot = shadowTree.olderShadowRoot;
-            if (olderShadowRoot) {
-              // 1.3.2.1.1
-              pool = poolPopulation(olderShadowRoot);
-            }
-
-            // 1.3.2.2
-            for (var j = 0; j < pool.length; j++) {
-              // 1.3.2.2.1
-              destributeNodeInto(pool[j], shadow);
-            }
-          }
-
-          // 1.3.3
-          this.distributionResolution(shadowTree);
-        }
-      }
-
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.distributionResolution(child);
+        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);
       }
     },
 
-    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm
-    poolDistribution: function (node, pool) {
-      if (node instanceof HTMLShadowElement)
-        return;
-
-      if (node instanceof HTMLContentElement) {
-        var content = node;
-        this.updateDependentAttributes(content.getAttribute('select'));
-
-        var anyDistributed = false;
-
-        // 1.1
-        for (var i = 0; i < pool.length; i++) {
-          var node = pool[i];
-          if (!node)
-            continue;
-          if (matches(node, content)) {
-            destributeNodeInto(node, content);
-            pool[i] = undefined;
-            anyDistributed = true;
-          }
-        }
-
-        // 1.2
-        // Fallback content
-        if (!anyDistributed) {
-          for (var child = content.firstChild;
-               child;
-               child = child.nextSibling) {
-            destributeNodeInto(child, content);
-          }
-        }
-
-        return;
-      }
-
-      for (var child = node.firstChild; child; child = child.nextSibling) {
-        this.poolDistribution(child, pool);
-      }
-    },
-
-    buildRenderTree: function(renderNode, node) {
-      var children = this.compose(node);
-      for (var i = 0; i < children.length; i++) {
-        var child = children[i];
-        var childRenderNode = renderNode.append(child);
-        this.buildRenderTree(childRenderNode, child);
-      }
+    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {
+      renderNode = renderNode.append(node);
 
       if (isShadowHost(node)) {
         var renderer = getRendererForHost(node);
-        renderer.dirty = false;
-      }
-
-    },
-
-    compose: function(node) {
-      var children = [];
-      var p = node.shadowRoot || node;
-      for (var child = p.firstChild; child; child = child.nextSibling) {
-        if (isInsertionPoint(child)) {
-          this.associateNode(p);
-          var distributedNodes = getDistributedNodes(child);
-          for (var j = 0; j < distributedNodes.length; j++) {
-            var distributedNode = distributedNodes[j];
-            if (isFinalDestination(child, distributedNode))
-              children.push(distributedNode);
-          }
-        } else {
-          children.push(child);
+        renderNode.skip = !renderer.dirty;
+        renderer.render(renderNode);
+      } else {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.renderNode(shadowRoot, renderNode, child, isNested);
         }
       }
-      return children;
+    },
+
+    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);
+      }
     },
 
     /**
@@ -6697,103 +6395,102 @@
       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;
     }
   };
 
-  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-population-algorithm
-  function poolPopulation(node) {
-    var pool = [];
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      if (isInsertionPoint(child)) {
-        pool.push.apply(pool, getDistributedNodes(child));
-      } else {
-        pool.push(child);
-      }
-    }
-    return pool;
-  }
-
-  function getShadowInsertionPoint(node) {
-    if (node instanceof HTMLShadowElement)
-      return node;
-    if (node instanceof HTMLContentElement)
-      return null;
-    for (var child = node.firstChild; child; child = child.nextSibling) {
-      var res = getShadowInsertionPoint(child);
-      if (res)
-        return res;
-    }
-    return null;
-  }
-
-  function destributeNodeInto(child, insertionPoint) {
-    getDistributedNodes(insertionPoint).push(child);
-    var points = destinationInsertionPointsTable.get(child);
-    if (!points)
-      destinationInsertionPointsTable.set(child, [insertionPoint]);
-    else
-      points.push(insertionPoint);
-  }
-
-  function getDestinationInsertionPoints(node) {
-    return destinationInsertionPointsTable.get(node);
-  }
-
-  function resetDestinationInsertionPoints(node) {
-    // IE11 crashes when delete is used.
-    destinationInsertionPointsTable.set(node, undefined);
-  }
-
-  // AllowedSelectors :
-  //   TypeSelector
-  //   *
-  //   ClassSelector
-  //   IDSelector
-  //   AttributeSelector
-  var selectorStartCharRe = /^[*.#[a-zA-Z_|]/;
-
-  function matches(node, contentElement) {
-    var select = contentElement.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;
-
-    if (!selectorStartCharRe.test(select))
-      return false;
-
-    try {
-      return node.matches(select);
-    } catch (ex) {
-      // Invalid selector.
-      return false;
-    }
-  }
-
-  function isFinalDestination(insertionPoint, node) {
-    var points = getDestinationInsertionPoints(node);
-    return points && points[points.length - 1] === insertionPoint;
-  }
-
   function isInsertionPoint(node) {
-    return node instanceof HTMLContentElement ||
-           node instanceof HTMLShadowElement;
+    // 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;
   }
 
-  // Returns the shadow trees as an array, with the youngest tree at the
-  // beginning of the array.
   function getShadowTrees(host) {
     var trees = [];
 
@@ -6803,6 +6500,11 @@
     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();
   };
@@ -6830,21 +6532,15 @@
     return false;
   };
 
-  HTMLContentElement.prototype.getDistributedNodes =
-  HTMLShadowElement.prototype.getDistributedNodes = function() {
+  HTMLContentElement.prototype.getDistributedNodes = function() {
     // TODO(arv): We should only rerender the dirty ancestor renderers (from
     // the root and down).
     renderAllPending();
-    return getDistributedNodes(this);
+    return getDistributedChildNodes(this);
   };
 
-  Element.prototype.getDestinationInsertionPoints = function() {
-    renderAllPending();
-    return getDestinationInsertionPoints(this) || [];
-  };
-
-  HTMLContentElement.prototype.nodeIsInserted_ =
-  HTMLShadowElement.prototype.nodeIsInserted_ = function() {
+  HTMLShadowElement.prototype.nodeIsInserted_ =
+  HTMLContentElement.prototype.nodeIsInserted_ = function() {
     // Invalidate old renderer if any.
     this.invalidateShadowRenderer();
 
@@ -6857,12 +6553,12 @@
       renderer.invalidate();
   };
 
+  scope.eventParentsTable = eventParentsTable;
   scope.getRendererForHost = getRendererForHost;
   scope.getShadowTrees = getShadowTrees;
+  scope.insertionParentTable = insertionParentTable;
   scope.renderAllPending = renderAllPending;
 
-  scope.getDestinationInsertionPoints = getDestinationInsertionPoints;
-
   // Exposed for testing
   scope.visual = {
     insertBefore: insertBefore,
@@ -7260,10 +6956,6 @@
           new DOMImplementation(unwrap(this).implementation);
       implementationTable.set(this, implementation);
       return implementation;
-    },
-
-    get defaultView() {
-      return wrap(unwrap(this).defaultView);
     }
   });
 
@@ -7379,13 +7071,9 @@
       renderAllPending();
       return new Selection(originalGetSelection.call(unwrap(this)));
     },
-
-    get document() {
-      return wrap(unwrap(this).document);
-    }
   });
 
-  registerWrapper(OriginalWindow, Window, window);
+  registerWrapper(OriginalWindow, Window);
 
   scope.wrappers.Window = Window;
 
@@ -7526,14 +7214,10 @@
 })(window.ShadowDOMPolyfill);
 
 /*
- * 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
+ * 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
@@ -7570,12 +7254,9 @@
 })();
 
 /*
- * 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
+ * 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.
  */
 
 /*
@@ -7991,16 +7672,13 @@
       if (this.selectorNeedsScoping(p, scopeSelector)) {
         p = (strict && !p.match(polyfillHostNoCombinator)) ? 
             this.applyStrictSelectorScope(p, scopeSelector) :
-            this.applySelectorScope(p, scopeSelector);
+            this.applySimpleSelectorScope(p, scopeSelector);
       }
       r.push(p);
     }, this);
     return r.join(', ');
   },
   selectorNeedsScoping: function(selector, scopeSelector) {
-    if (Array.isArray(scopeSelector)) {
-      return true;
-    }
     var re = this.makeScopeMatcher(scopeSelector);
     return !selector.match(re);
   },
@@ -8008,19 +7686,6 @@
     scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
     return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
   },
-  applySelectorScope: function(selector, selectorScope) {
-    return Array.isArray(selectorScope) ?
-        this.applySelectorScopeList(selector, selectorScope) :
-        this.applySimpleSelectorScope(selector, selectorScope);
-  },
-  // apply an array of selectors
-  applySelectorScopeList: function(selector, scopeSelectorList) {
-    var r = [];
-    for (var i=0, s; (s=scopeSelectorList[i]); i++) {
-      r.push(this.applySimpleSelectorScope(selector, s));
-    }
-    return r.join(', ');
-  },
   // scope via name and [is=name]
   applySimpleSelectorScope: function(selector, scopeSelector) {
     if (selector.match(polyfillHostRe)) {
@@ -8326,24 +7991,25 @@
 scope.ShadowCSS = ShadowCSS;
 
 })(window.Platform);
-
 } else {
 /*
- * 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
+ * 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(scope) {
+  // 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;
@@ -8354,8 +8020,8 @@
       };
     }
   });
-
-  Platform.templateContent = function(inTemplate) {
+  
+  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);
@@ -8372,8 +8038,7 @@
     return inTemplate.content || inTemplate._content;
   };
 
-})(window.Platform);
-
+})();
 }
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
@@ -8942,12 +8607,9 @@
 })(window);
 
 /*
- * 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
+ * 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) {
@@ -9003,15 +8665,19 @@
 scope.mixin = mixin;
 
 })(window.Platform);
-
-/*
- * 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
- */
+// 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) {
 
@@ -9147,30 +8813,15 @@
 })(window.Platform);
 
 /*
- * 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
+ * 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
-(function(scope) {
-  scope.templateContent = scope.templateContent || function(inTemplate) {
-    return inTemplate.content;
-  };
-})(window.Platform);
-
-/*
- * 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
- */
-
+window.templateContent = window.templateContent || function(inTemplate) {
+  return inTemplate.content;
+};
 (function(scope) {
   
   scope = scope || (window.Inspector = {});
@@ -9360,15 +9011,13 @@
   
 })(window.Inspector);
 
-/*
- * 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
- */
 
+
+/*
+ * 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 
@@ -9392,15 +9041,6 @@
 
 })(Platform);
 
-/*
- * 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(scope) {
 
   function withDependencies(task, depends) {
@@ -9448,16 +9088,11 @@
   scope.using = using;
 
 })(window);
-
 /*
- * 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
+ * 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;
@@ -9487,12 +9122,9 @@
 
 
 /*
- * 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
+ * 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) {
@@ -9527,9 +9159,9 @@
     url = url || style.ownerDocument.baseURI;
     style.textContent = this.resolveCssText(style.textContent, url);
   },
-  resolveCssText: function(cssText, baseUrl, keepAbsolute) {
-    cssText = replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_URL_REGEXP);
-    return replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, CSS_IMPORT_REGEXP);
+  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()) {
@@ -9547,15 +9179,10 @@
     url = url || node.ownerDocument.baseURI;
     URL_ATTRS.forEach(function(v) {
       var attr = node.attributes[v];
-      var value = attr && attr.value;
-      var replacement;
-      if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
-        if (v === 'style') {
-          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);
-        } else {
-          replacement = resolveRelativeUrl(url, value);
-        }
-        attr.value = replacement;
+      if (attr && attr.value &&
+         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {
+        var urlPath = resolveRelativeUrl(url, attr.value);
+        attr.value = urlPath;
       }
     });
   }
@@ -9563,42 +9190,36 @@
 
 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'];
 var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
 var URL_TEMPLATE_SEARCH = '{{.*}}';
 
-function replaceUrlsInCssText(cssText, baseUrl, keepAbsolute, regexp) {
+function replaceUrlsInCssText(cssText, baseUrl, regexp) {
   return cssText.replace(regexp, function(m, pre, url, post) {
     var urlPath = url.replace(/["']/g, '');
-    urlPath = resolveRelativeUrl(baseUrl, urlPath, keepAbsolute);
+    urlPath = resolveRelativeUrl(baseUrl, urlPath);
     return pre + '\'' + urlPath + '\'' + post;
   });
 }
 
-function resolveRelativeUrl(baseUrl, url, keepAbsolute) {
-  // do not resolve '/' absolute urls
-  if (url && url[0] === '/') {
-    return url;
-  }
+function resolveRelativeUrl(baseUrl, url) {
   var u = new URL(url, baseUrl);
-  return keepAbsolute ? u.href : makeDocumentRelPath(u.href);
+  return makeDocumentRelPath(u.href);
 }
 
 function makeDocumentRelPath(url) {
-  var root = new URL(document.baseURI);
+  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, u);
+    return makeRelPath(root.pathname, u.pathname);
   } else {
     return url;
   }
 }
 
 // make a relative path from source to target
-function makeRelPath(sourceUrl, targetUrl) {
-  var source = sourceUrl.pathname;
-  var target = targetUrl.pathname;
+function makeRelPath(source, target) {
   var s = source.split('/');
   var t = target.split('/');
   while (s.length && s[0] === t[0]){
@@ -9608,7 +9229,7 @@
   for (var i = 0, l = s.length - 1; i < l; i++) {
     t.unshift('..');
   }
-  return t.join('/') + targetUrl.search + targetUrl.hash;
+  return t.join('/');
 }
 
 // exports
@@ -10846,7 +10467,8 @@
   var loaded = 0, l = imports.length;
   function checkDone(d) { 
     if (loaded == l) {
-      callback && callback();
+      // go async to ensure parser isn't stuck on a script tag
+      requestAnimationFrame(callback);
     }
   }
   function loadedImport(e) {
@@ -10868,50 +10490,10 @@
 }
 
 function isImportLoaded(link) {
-  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :
+  return useNative ? (link.import && (link.import.readyState !== 'loading')) :
       link.__importParsed;
 }
 
-// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded
-// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007
-// and should be removed when this bug is addressed.
-if (useNative) {
-  new MutationObserver(function(mxns) {
-    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {
-      if (m.addedNodes) {
-        handleImports(m.addedNodes);
-      }
-    }
-  }).observe(document.head, {childList: true});
-
-  function handleImports(nodes) {
-    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-      if (isImport(n)) {
-        handleImport(n);  
-      }
-    }
-  }
-
-  function isImport(element) {
-    return element.localName === 'link' && element.rel === 'import';
-  }
-
-  function handleImport(element) {
-    var loaded = element.import;
-    if (loaded) {
-      markTargetLoaded({target: element});
-    } else {
-      element.addEventListener('load', markTargetLoaded);
-      element.addEventListener('error', markTargetLoaded);
-    }
-  }
-
-  function markTargetLoaded(event) {
-    event.target.__loaded = true;
-  }
-
-}
-
 // exports
 scope.hasNative = hasNative;
 scope.useNative = useNative;
@@ -11593,11 +11175,7 @@
       // work out prototype when using type-extension
       if (definition.is) {
         var inst = document.createElement(definition.tag);
-        var expectedPrototype = Object.getPrototypeOf(inst);
-        // only set nativePrototype if it will actually appear in the definition's chain
-        if (expectedPrototype === definition.prototype) {
-          nativePrototype = expectedPrototype;
-        }
+        nativePrototype = Object.getPrototypeOf(inst);
       }
       // ensure __proto__ reference is installed at each point on the prototype
       // chain.
@@ -11606,13 +11184,13 @@
       // limited support for prototype traversal.
       var proto = definition.prototype, ancestor;
       while (proto && (proto !== nativePrototype)) {
-        ancestor = Object.getPrototypeOf(proto);
+        var ancestor = Object.getPrototypeOf(proto);
         proto.__proto__ = ancestor;
         proto = ancestor;
       }
-      // cache this in case of mixin
-      definition.native = nativePrototype;
     }
+    // cache this in case of mixin
+    definition.native = nativePrototype;
   }
 
   // SECTION 4
@@ -12003,14 +11581,10 @@
 })(window.CustomElements);
 
 /*
- * 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
+ * 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) {
@@ -12037,26 +11611,18 @@
 })();
 
 /*
- * 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
+ * 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.cache = Object.create(null);
-    this.map = Object.create(null);
-    this.requests = 0;
     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) {
@@ -12072,78 +11638,63 @@
     // returns a map of absolute url to text
     process: function(text, root, callback) {
       var matches = this.extractUrls(text, root);
-
-      // every call to process returns all the text this loader has ever received
-      var done = callback.bind(null, this.map);
-      this.fetch(matches, done);
+      this.fetch(matches, {}, callback);
     },
     // build a mapping of url -> text from matches
-    fetch: function(matches, callback) {
+    fetch: function(matches, map, callback) {
       var inflight = matches.length;
 
       // return early if there is no fetching to be done
       if (!inflight) {
-        return callback();
+        return callback(map);
       }
 
-      // wait for all subrequests to return
       var done = function() {
         if (--inflight === 0) {
-          callback();
+          callback(map);
         }
       };
 
-      // start fetching all subrequests
+      // 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;
-        req = this.cache[url];
         // if this url has already been requested, skip requesting it again
-        if (!req) {
-          req = this.xhr(url);
-          req.match = m;
-          this.cache[url] = req;
+        if (map[url]) {
+          // Async call to done to simplify the inflight logic
+          endOfMicrotask(done);
+          continue;
         }
-        // wait for the request to process its subrequests
-        req.wait(done);
+        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;
       }
     },
-    handleXhr: function(request) {
-      var match = request.match;
-      var url = match.url;
-
-      // handle errors with an empty string
-      var response = request.response || request.responseText || '';
-      this.map[url] = response;
-      this.fetch(this.extractUrls(response, url), request.resolve);
-    },
-    xhr: function(url) {
-      this.requests++;
+    xhr: function(url, callback, scope) {
       var request = new XMLHttpRequest();
       request.open('GET', url, true);
       request.send();
-      request.onerror = request.onload = this.handleXhr.bind(this, request);
-
-      // queue of tasks to run after XHR returns
-      request.pending = [];
-      request.resolve = function() {
-        var pending = request.pending;
-        for(var i = 0; i < pending.length; i++) {
-          pending[i]();
-        }
-        request.pending = null;
+      request.onload = function() {
+        callback.call(scope, null, request);
       };
-
-      // if we have already resolved, pending is null, async call the callback
-      request.wait = function(fn) {
-        if (request.pending) {
-          request.pending.push(fn);
-        } else {
-          endOfMicrotask(fn);
-        }
+      request.onerror = function() {
+        callback.call(scope, null, request);
       };
-
       return request;
     }
   };
@@ -12152,14 +11703,10 @@
 })(window.Platform);
 
 /*
- * 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
+ * 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;
@@ -12178,8 +11725,9 @@
     this.loader.process(text, url, done);
   },
   // resolve the textContent of a style node
-  resolveNode: function(style, url, callback) {
+  resolveNode: function(style, callback) {
     var text = style.textContent;
+    var url = style.ownerDocument.baseURI;
     var done = function(text) {
       style.textContent = text;
       callback(style);
@@ -12193,15 +11741,15 @@
     for (var i = 0; i < matches.length; i++) {
       match = matches[i];
       url = match.url;
-      // resolve any css text to be relative to the importer, keep absolute url
-      intermediate = urlResolver.resolveCssText(map[url], url, true);
+      // resolve any css text to be relative to the importer
+      intermediate = urlResolver.resolveCssText(map[url], url);
       // flatten intermediate @imports
-      intermediate = this.flatten(intermediate, base, map);
+      intermediate = this.flatten(intermediate, url, map);
       text = text.replace(match.matched, intermediate);
     }
     return text;
   },
-  loadStyles: function(styles, base, callback) {
+  loadStyles: function(styles, callback) {
     var loaded=0, l = styles.length;
     // called in the context of the style
     function loadedStyle(style) {
@@ -12211,7 +11759,7 @@
       }
     }
     for (var i=0, s; (i<l) && (s=styles[i]); i++) {
-      this.resolveNode(s, base, loadedStyle);
+      this.resolveNode(s, loadedStyle);
     }
   }
 };
@@ -12223,6 +11771,2582 @@
 
 })(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
@@ -12247,8 +14371,6 @@
     console.error('Unhandled binding to Node: ', this, name, observable);
   };
 
-  Node.prototype.bindFinished = function() {};
-
   function updateBindings(node, name, binding) {
     var bindings = node.bindings_;
     if (!bindings)
@@ -12833,7 +14955,7 @@
       var owner = template.ownerDocument;
       if (!owner.stagingDocument_) {
         owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
-        owner.stagingDocument_.isStagingDocument = true;
+
         // TODO(rafaelw): Remove when fix for
         // https://codereview.chromium.org/164803002/
         // makes it to Chrome release.
@@ -13076,8 +15198,6 @@
     createInstance: function(model, bindingDelegate, delegate_) {
       if (bindingDelegate)
         delegate_ = this.newDelegate_(bindingDelegate);
-      else if (!delegate_)
-        delegate_ = this.delegate_;
 
       if (!this.refContent_)
         this.refContent_ = this.ref_.content;
@@ -13085,7 +15205,16 @@
       if (content.firstChild === null)
         return emptyInstance;
 
-      var map = getInstanceBindingMap(content, delegate_);
+      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;
@@ -13171,7 +15300,7 @@
 
     newDelegate_: function(bindingDelegate) {
       if (!bindingDelegate)
-        return;
+        return {};
 
       function delegateFn(name) {
         var fn = bindingDelegate && bindingDelegate[name];
@@ -13184,7 +15313,6 @@
       }
 
       return {
-        bindingMaps: {},
         raw: bindingDelegate,
         prepareBinding: delegateFn('prepareBinding'),
         prepareInstanceModel: delegateFn('prepareInstanceModel'),
@@ -13363,7 +15491,6 @@
         instanceBindings.push(binding);
     }
 
-    node.bindFinished();
     if (!bindings.isTemplate)
       return;
 
@@ -13475,43 +15602,6 @@
     return map;
   }
 
-  var contentUidCounter = 1;
-
-  // TODO(rafaelw): Setup a MutationObserver on content which clears the id
-  // so that bindingMaps regenerate when the template.content changes.
-  function getContentUid(content) {
-    var id = content.id_;
-    if (!id)
-      id = content.id_ = contentUidCounter++;
-    return id;
-  }
-
-  // Each delegate is associated with a set of bindingMaps, one for each
-  // content which may be used by a template. The intent is that each binding
-  // delegate gets the opportunity to prepare the instance (via the prepare*
-  // delegate calls) once across all uses.
-  // TODO(rafaelw): Separate out the parse map from the binding map. In the
-  // current implementation, if two delegates need a binding map for the same
-  // content, the second will have to reparse.
-  function getInstanceBindingMap(content, delegate_) {
-    var contentId = getContentUid(content);
-    if (delegate_) {
-      var map = delegate_.bindingMaps[contentId];
-      if (!map) {
-        map = delegate_.bindingMaps[contentId] =
-            createInstanceBindingMap(content, delegate_.prepareBinding) || [];
-      }
-      return map;
-    }
-
-    var map = content.bindingMap_;
-    if (!map) {
-      map = content.bindingMap_ =
-          createInstanceBindingMap(content, undefined) || [];
-    }
-    return map;
-  }
-
   Object.defineProperty(Node.prototype, 'templateInstance', {
     get: function() {
       var instance = this.templateInstance_;
@@ -13827,14 +15917,1739 @@
 })(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
- */
+  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
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index df7b0d1..93e18ca 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -2,7 +2,6 @@
   "version": 3,
   "file": "platform.concat.js",
   "sources": [
-    "build/boot.js",
     "../WeakMap/weakmap.js",
     "../observe-js/src/observe.js",
     "build/if-poly.js",
@@ -11,7 +10,6 @@
     "../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",
@@ -78,36 +76,57 @@
     "src/patches-custom-elements.js",
     "src/loader.js",
     "src/styleloader.js",
+    "../PointerEvents/src/boot.js",
+    "../PointerEvents/src/touch-action.js",
+    "../PointerEvents/src/PointerEvent.js",
+    "../PointerEvents/src/pointermap.js",
+    "../PointerEvents/src/dispatcher.js",
+    "../PointerEvents/src/installer.js",
+    "../PointerEvents/src/mouse.js",
+    "../PointerEvents/src/touch.js",
+    "../PointerEvents/src/ms.js",
+    "../PointerEvents/src/platform-events.js",
+    "../PointerEvents/src/capture.js",
+    "../PointerGestures/src/PointerGestureEvent.js",
+    "../PointerGestures/src/initialize.js",
+    "../PointerGestures/src/pointermap.js",
+    "../PointerGestures/src/dispatcher.js",
+    "../PointerGestures/src/hold.js",
+    "../PointerGestures/src/track.js",
+    "../PointerGestures/src/flick.js",
+    "../PointerGestures/src/pinch.js",
+    "../PointerGestures/src/tap.js",
+    "../PointerGestures/src/registerScopes.js",
     "../NodeBind/src/NodeBind.js",
     "../TemplateBinding/src/TemplateBinding.js",
+    "../polymer-expressions/third_party/esprima/esprima.js",
+    "../polymer-expressions/src/polymer-expressions.js",
     "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;AACA;AACA;AACA;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;;ACzjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AC3tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;ACjuBA,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;AACA;AACA,K;AC9CA,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,oB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;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;AACA;AACA;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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 * 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",
+    "// 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 document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\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);\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  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 emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!obj)\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\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        observedSetCache.push(this);\n      },\n      reset: scheduleReset\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);\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.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\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_ = path instanceof Path ? 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() {\n    Observer.call(this);\n\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      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\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 (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: 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    },\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      this.closeObservers_();\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      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\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.closeObservers_();\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 pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\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 notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify('update', oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\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.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",
+    "// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript ||\r\n      document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\r\n    console.warn('platform.js is not the first script on the page. ' +\r\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\r\n        'for details.');\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\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  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\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    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\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  // 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    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\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  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\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  /**\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   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\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.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 isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\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  }\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      case 'beforeunload':\n      case 'load':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window \"load\" events the \"load\" event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document &&\n        isLoadLikeEvent(event)) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\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 = adjustRelatedTarget(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    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 === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.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 (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\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].currentTarget;\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    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\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.adjustRelatedTarget = adjustRelatedTarget;\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 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  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\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",
+    "/**\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\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  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 findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\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 findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\n      return result;\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 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    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 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    // TODO: attribute boolean resetStyleInheritance;\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\n  var OriginalHTMLShadowElement = window.HTMLShadowElement;\n\n  function HTMLShadowElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);\n  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\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",
@@ -124,45 +143,68 @@
     "// 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 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    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\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 distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.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  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.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    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.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  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      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\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    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\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    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\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 assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\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 = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.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.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\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",
+    "// 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\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\n  registerWrapper(OriginalWindow, 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 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  // 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 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\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.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\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  // 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);",
     "} 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",
+    "/*\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  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\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  window.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})();",
     "}",
     "/* 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 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// 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);",
+    "// Copyright 2011 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(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 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// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\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\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(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",
+    "(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 * 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\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 */\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) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, 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      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\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'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = 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.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\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('/');\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",
+    "/*\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      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(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')) :\n      link.__importParsed;\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/**\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        nativePrototype = Object.getPrototypeOf(inst);\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        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\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"
+    "/*\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\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 2014 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  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\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      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n",
+    "/*\n * Copyright 2014 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\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, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\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\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, 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, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\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  scope = scope || {};\n  scope.external = scope.external || {};\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      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  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\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  function shadowSelector(v) {\n    return 'body /shadow-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 + '; touch-action-delay: none; }';\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 hasNativePE = window.PointerEvent || window.MSPointerEvent;\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasNativePE) {\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 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 * 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  function PointerEvent(inType, inDict) {\n    inDict = inDict || Object.create(null);\n\n    var e = document.createEvent('Event');\n    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n\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  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\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 * 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.PointerEventsPolyfill);\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  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  ];\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  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\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    captureInfo: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\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    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    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents 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._handledByPE) {\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._handledByPE = 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: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.removeEvent || function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\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      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo[inEvent.pointerId]) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\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 (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      return this.captureInfo[inEvent.pointerId] || inEvent._target;\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo[inPointerId]) {\n        this.releaseCapture(inPointerId);\n      }\n      this.captureInfo[inPointerId] = inTarget;\n      var e = document.createEvent('Event');\n      e.initEvent('gotpointercapture', true, false);\n      e.pointerId = inPointerId;\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      e._target = inTarget;\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      var t = this.captureInfo[inPointerId];\n      if (t) {\n        var e = document.createEvent('Event');\n        e.initEvent('lostpointercapture', true, false);\n        e.pointerId = inPointerId;\n        this.captureInfo[inPointerId] = undefined;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        e._target = t;\n        this.asyncDispatchEvent(e);\n      }\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: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\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 * 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('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\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  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      'mouseover',\n      'mouseout'\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      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\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.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var captureInfo = dispatcher.captureInfo;\n  var findTarget = scope.findTarget;\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  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = 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 (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\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    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 = captureInfo[id] || findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\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.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\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.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\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_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\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  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      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\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      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\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 * 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  // only activate if this platform does not have pointer events\n  if (window.PointerEvent !== scope.PointerEvent) {\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\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  }\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\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 * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\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 */\n\n(function(scope) {\n  /**\n   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\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; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\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 * 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.PointerGestures);\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  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    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\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  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\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 = {}, 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      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\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 * 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 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      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\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    pointerdown: 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    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: 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        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\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 trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.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.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: 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     pointermove: 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       }\n     },\n     pointerup: 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     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\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 * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: 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    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n",
+    "/*\n * Copyright 2014 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 * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\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  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\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\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 = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\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        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    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  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) 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  // 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  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    // 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.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\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  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\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 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 resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\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      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\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  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\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 */\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..b8a5c3f 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -1,17 +1,39 @@
 /**
  * @license
- * 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
+ * Copyright (c) 2012-2014 The Polymer Authors. All rights reserved.
+ * 
+ * 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.
+ *    * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * 
+ * 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 THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS 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.
  */
-// @version: 0.2.4-15e4e51
-
-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);
+// @version: 0.2.2-ccb7c30
+function PointerGestureEvent(a,b){var c=b||{},d=document.createEvent("Event"),e={bubbles:Boolean(c.bubbles)===c.bubbles||!0,cancelable:Boolean(c.cancelable)===c.cancelable||!0};d.initEvent(a,e.bubbles,e.cancelable);for(var f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],d[f]=c[f];return d.preventTap=this.preventTap,d}"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(global.document&&"securityPolicy"in global.document&&!global.document.securityPolicy.allowsEval)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){if(b){var c=i.indexOf(b);c>=0?(i[c]=void 0,h.push(b)):h.indexOf(b)<0&&(h.push(b),Object.observe(b,e)),a(Object.getPrototypeOf(b))}}function b(){var b=i===emptyArray?[]:i;i=h,h=b;var c;for(var d in f)c=f[d],c&&c.state_==OPENED&&c.iterateObjects_(a);for(var g=0;g<i.length;g++){var j=i[g];j&&Object.unobserve(j,e)}i.length=0}function c(){k=!1,j&&b()}function d(){k||(j=!0,k=!0,runEOM(c))}function e(){b();var a;for(var c in f)a=f[c],a&&a.state_==OPENED&&a.check_()}var f=[],g=0,h=[],i=emptyArray,j=!1,k=!1,l={object:void 0,objects:h,open:function(b){f[b.id_]=b,g++,b.iterateObjects_(a)},close:function(a){if(f[a.id_]=void 0,g--,g)return void d();j=!1;for(var b=0;b<h.length;b++)Object.unobserve(h[b],e),Observer.unobservedCount++;f.length=0,h.length=0,observedSetCache.push(this)},reset:d};return l}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a),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_=b instanceof Path?b:getPath(b),this.directObserver_=void 0}function CompoundObserver(){Observer.call(this),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 notifyFunction(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}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)}},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=[],emptyArray=[],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.state_=OPENED,this.connect_(),this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.state_=CLOSED,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0)},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(this.check_(void 0,!0),hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}return this.directObserver_?b?void this.directObserver_.reset():(this.directObserver_.close(),void(this.directObserver_=void 0)):void(b&&(this.directObserver_=getObservedSet(this,a)))}},closeObservers_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0),this.closeObservers_()},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");this.observed_.push(a,b instanceof Path?b:getPath(b))},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");a.open(this.deliver,this),this.observed_.push(observerSentinel,a)},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");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=this.observed_[d+1],f=this.observed_[d],g=f===observerSentinel?e.discardChanges():e.getValueFrom(f);b?this.value_[d/2]=g:areSameValue(g,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=g)}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};Observer.defineComputedProperty=function(a,b,c){var d=notifyFunction(a,b),e=c.open(function(a,b){e=a,d&&d("update",b)});return Object.defineProperty(a,b,{get:function(){return c.deliver(),e},set:function(a){return c.setValue(a),a},configurable:!0}),{close:function(){c.close(),Object.defineProperty(a,b,{value:e,writable:!0,configurable:!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.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),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),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return L(b).forEach(function(c){K(a,c,M(b,c))}),a}function d(a,b){return L(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}K(a,c,M(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=E.get(b);if(c)return c;var d=f(b),e=t(d);return q(b,e,a),e}function g(a,b){o(a,b,!0)}function h(a,b){o(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return H&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return H&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return H&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return O}}function o(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])){N&&b.__lookupGetter__(g);var h,j,o=n(b,g);if(d&&"function"==typeof o.value)c[g]=m(g);else{var p=i(g);h=p?a.getEventHandlerGetter(g):k(g),(o.writable||o.set)&&(j=p?a.getEventHandlerSetter(g):l(g)),K(c,g,{get:h,set:j,configurable:o.configurable,enumerable:o.enumerable})}}}}function p(a,b,c){var e=a.prototype;q(e,b,c),d(b,a)}function q(a,c,d){var e=c.prototype;b(void 0===E.get(a)),E.set(a,c),F.set(e,a),g(a,e),d&&h(e,d),K(e,"constructor",{value:c,configurable:!0,enumerable:!1,writable:!0}),c.prototype=e}function r(a,b){return E.get(b.prototype)===a}function s(a){var b=Object.getPrototypeOf(a),c=f(b),d=t(c);return q(b,d,a),d}function t(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function u(a){return a instanceof G.EventTarget||a instanceof G.Event||a instanceof G.Range||a instanceof G.DOMImplementation||a instanceof G.CanvasRenderingContext2D||G.WebGLRenderingContext&&a instanceof G.WebGLRenderingContext}function v(a){return Q&&a instanceof Q||a instanceof S||a instanceof R||a instanceof T||a instanceof U||a instanceof P||a instanceof V||W&&a instanceof W||X&&a instanceof X}function w(a){return null===a?null:(b(v(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function x(a){return null===a?null:(b(u(a)),a.impl)}function y(a){return a&&u(a)?x(a):a}function z(a){return a&&!u(a)?w(a):a}function A(a,c){null!==c&&(b(v(a)),b(void 0===c||u(c)),a.polymerWrapper_=c)}function B(a,b,c){K(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function C(a,b){B(a,b,function(){return w(this.impl[b])})}function D(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=z(this);return a[b].apply(a,arguments)}})})}var E=new WeakMap,F=new WeakMap,G=Object.create(null),H=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(H)try{var I=new Function("","return true;");H=I()}catch(J){H=!1}var K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor;L(window);var N=/Firefox/.test(navigator.userAgent),O={get:function(){},set:function(){},configurable:!0,enumerable:!0},P=window.DOMImplementation,Q=window.EventTarget,R=window.Event,S=window.Node,T=window.Window,U=window.Range,V=window.CanvasRenderingContext2D,W=window.WebGLRenderingContext,X=window.SVGElementInstance;a.assert=b,a.constructorTable=E,a.defineGetter=B,a.defineWrapGetter=C,a.forwardMethodsToWrapper=D,a.isWrapper=u,a.isWrapperFor=r,a.mixin=c,a.nativePrototypeTable=F,a.oneOf=e,a.registerObject=s,a.registerWrapper=p,a.rewrap=A,a.unwrap=x,a.unwrapIfNeeded=y,a.wrap=w,a.wrapIfNeeded=z,a.wrappers=G}(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(a){if(a.treeScope_)return a.treeScope_;var c,e=a.parentNode;return c=e?d(e):new b(a,null),a.treeScope_=c}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){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&P(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var m=null;if(g.length){if(c(i)&&(m=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(l(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,m,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a,b){return L(a)===L(b)}function m(a){S.get(a)||(S.set(a,!0),o(P(a),P(a.target)))}function n(a){switch(a.type){case"beforeunload":case"load":case"unload":return!0}return!1}function o(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var d=g(c);return 2===d.length&&d[0].target instanceof Q.Document&&n(b)&&d.shift(),_.set(b,d),p(b,d)&&q(b,d)&&r(b,d),X.set(b,u.NONE),V.delete(b,null),T.delete(b),b.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||Z.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=R.get(e);if(!f)return!0;if("relatedTarget"in b){var g=O(b),h=g.relatedTarget;if(h){if(h instanceof Object&&h.addEventListener){var j=P(h),k=i(e,j);if(k===d)return!0}else k=null;W.set(b,k)}}X.set(b,c);var l=b.type,m=!1;U.set(b,d),V.set(b,e);for(var n=0;n<f.length;n++){var o=f[n];if(o.removed)m=!0;else if(!(o.type!==l||!o.capture&&c===u.CAPTURING_PHASE||o.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof o.handler?o.handler.call(e,b):o.handler.handleEvent(b),Z.get(b))return!1}catch(p){window.onerror?window.onerror(p.message):console.error(p,p.stack)}}if(m){var q=f.slice();f.length=0;for(var n=0;n<q.length;n++)q[n].removed||f.push(q[n])}return!Y.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){if(!(a instanceof ab))return P(y(ab,"Event",a,b));
+var c=a;return lb||"beforeunload"!==c.type?void(this.impl=c):new z(c)}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(y(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 x(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(jb)return new a(c,v(d));var e=O(document.createEvent(b)),f=ib[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 z(a){u.call(this,a)}function A(a){return"function"==typeof a?!0:a&&a.handleEvent}function B(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 C(a){this.impl=a}function D(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function E(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 F(a,b){for(var c=O(a);c;c=c.parentNode)if(E(P(c),b))return!0;return!1}function G(a){K(a,nb)}function H(b,c,d,e){a.renderAllPending();for(var f=P(ob.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function I(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function J(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 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;t.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 ab=window.Event;ab.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},u.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].currentTarget,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(ab,u,document.createEvent("Event"));var bb=w("UIEvent",u),cb=w("CustomEvent",u),db={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},eb=M({initMouseEvent:x("initMouseEvent",14)},db),fb=M({initFocusEvent:x("initFocusEvent",5)},db),gb=w("MouseEvent",bb,eb),hb=w("FocusEvent",bb,fb),ib=Object.create(null),jb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=M(M({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.BeforeUnloadEvent;z.prototype=Object.create(u.prototype),M(z.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),lb&&N(lb,z);var mb=window.EventTarget,nb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;nb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),C.prototype={addEventListener:function(a,b,c){if(A(b)&&!B(a)){var d=new t(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=D(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=D(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;F(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},mb&&N(mb,C);var ob=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=H,a.getEventHandlerGetter=I,a.getEventHandlerSetter=J,a.wrapEventTargetMethods=G,a.wrappers.BeforeUnloadEvent=z,a.wrappers.CustomEvent=cb,a.wrappers.Event=u,a.wrappers.EventTarget=C,a.wrappers.FocusEvent=hb,a.wrappers.MouseEvent=gb,a.wrappers.UIEvent=bb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}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;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]);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,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(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" ":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,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,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),this.treeScope_=new d(this,g(a));var e=a.shadowRoot;m.set(this,e),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,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){var b=I.get(a);return b||I.set(a,b=[]),b}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(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("*"===c||c===a.localName)return!0;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++){var b=P[a],c=b.parentRenderer;c&&c.dirty||b.render()}P=[]}function l(){y=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){var b=E(a).root;return b instanceof D?b:null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof A}function s(a){return a instanceof A}function t(a){return a instanceof B}function u(a){return a instanceof B}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,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=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=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("|")+")"),O=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.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(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.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),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),y)return;y=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},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]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=function(){return k(),g(this)},B.prototype.nodeIsInserted_=A.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,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)}}),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)))}}),f(k,b),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.applySimpleSelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},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.templateContent=window.templateContent||function(a){return a.content},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}}}),window.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}}(),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),window.templateContent=window.templateContent||function(a){return a.content},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){return a.replace(d,function(a,d,e,f){var g=e.replace(/["']/g,"");return g=c(b,g),d+"'"+g+"'"+f})}function c(a,b){var c=new URL(b,a);return d(c.href)}function d(a){var b=document.baseURI,c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b.pathname,c.pathname):a}function e(a,b){for(var c=a.split("/"),d=b.split("/");c.length&&c[0]===d[0];)c.shift(),d.shift();for(var e=0,f=c.length-1;f>e;e++)d.unshift("..");return d.join("/")}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){return a=b(a,c,g),b(a,c,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,b){b=b||a.ownerDocument.baseURI,i.forEach(function(d){var e=a.attributes[d];if(e&&e.value&&e.value.search(k)<0){var f=c(b,e.value);e.value=f}})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action"],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,m)}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(m)),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||n,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===u}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===u)&&(b.removeEventListener(v,c),g(a,b))};b.addEventListener(v,c)}}function h(a,b){function c(){f==g&&requestAnimationFrame(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 k?a.import&&"loading"!==a.import.readyState:a.__importParsed}var j="import"in document.createElement("link"),k=j,l=a.flags,m="import",n=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(k)var o={};else var p=(a.xhr,a.Loader),q=a.parser,o={documents:{},documentPreloadSelectors:"link[rel="+m+"]",importsPreloadSelectors:["link[rel="+m+"]"].join(","),loadNode:function(a){r.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);r.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===n?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(l.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}q.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),q.parseNext()},loadedAll:function(){q.parseNext()}},r=new p(o.loaded.bind(o),o.loadedAll.bind(o));var s={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",s),Object.defineProperty(n,"_currentScript",s),!document.baseURI){var t={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",t),Object.defineProperty(n,"baseURI",t)}var u=HTMLImports.isIE?"complete":"interactive",v="readystatechange";a.hasNative=j,a.useNative=k,a.importer=o,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=m,a.isImportLoaded=i,a.importLoader=r}(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);b=Object.getPrototypeOf(c)}for(var d,e=a.prototype;e&&e!==b;){var d=Object.getPrototypeOf(e);e.__proto__=d,e=d}}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.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);this.fetch(d,{},c)},fetch:function(a,b,d){var e=a.length;if(!e)return d(b);for(var f,g,h,i=function(){0===--e&&d(b)},j=function(a,c){var d=c.match,e=d.url;if(a)return b[e]="",i();
+var f=c.response||c.responseText;b[e]=f,this.fetch(this.extractUrls(f,e),b,i)},k=0;e>k;k++)f=a[k],h=f.url,b[h]?c(i):(g=this.xhr(h,j,this),g.match=f,b[h]=g)},xhr:function(a,b,c){var d=new XMLHttpRequest;return d.open("GET",a,!0),d.send(),d.onload=function(){b.call(c,null,d)},d.onerror=function(){b.call(c,null,d)},d}},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){var c=a.textContent,d=a.ownerDocument.baseURI,e=function(c){a.textContent=c,b(a)};this.resolve(c,d,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),g=this.flatten(g,f,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b){function c(){e++,e===f&&b&&b()}for(var d,e=0,f=a.length,g=0;f>g&&(d=a[g]);g++)this.resolveNode(d,c)}};var e=new b;a.styleResolver=e}(window.Platform),function(a){a=a||{},a.external=a.external||{};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){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)}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),window.PointerEventsPolyfill=a}(window.PointerEventsPolyfill),function(){function a(a){return"body /shadow-deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; touch-action-delay: none; }"}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,window.PointerEvent||window.MSPointerEvent),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){function b(a,b){b=b||Object.create(null);var e=document.createEvent("Event");e.initEvent(a,b.bubbles||!1,b.cancelable||!1);for(var f,g=0;g<c.length;g++)f=c[g],e[f]=b[f]||d[g];e.buttons=b.buttons||0;var h=0;return h=b.pressure?b.pressure:e.buttons?.5:0,e.x=e.clientX,e.y=e.clientY,e.pointerId=b.pointerId||0,e.width=b.width||0,e.height=b.height||0,e.pressure=h,e.tiltX=b.tiltX||0,e.tiltY=b.tiltY||0,e.pointerType=b.pointerType||"",e.hwTimestamp=b.hwTimestamp||0,e.isPrimary=b.isPrimary||!1,e}var c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0];a.PointerEvent||(a.PointerEvent=b)}(window),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.PointerEventsPolyfill),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"],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],d="undefined"!=typeof SVGElementInstance,e={pointermap:new a.PointerMap,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],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))},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)},contains:a.external.contains||function(a,b){return a.contains(b)},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.contains(a.target,a.relatedTarget)||this.leave(a)},enterOver:function(a){this.over(a),this.contains(a.target,a.relatedTarget)||this.enter(a)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!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:a.external.addEvent||function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:a.external.removeEvent||function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){this.captureInfo[b.pointerId]&&(b.relatedTarget=null);var c=new PointerEvent(a,b);return b.preventDefault&&(c.preventDefault=b.preventDefault),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),g=0;g<b.length;g++)e=b[g],f[e]=a[e]||c[g],!d||"target"!==e&&"relatedTarget"!==e||f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return a.preventDefault&&(f.preventDefault=function(){a.preventDefault()}),f},getTarget:function(a){return this.captureInfo[a.pointerId]||a._target},setCapture:function(a,b){this.captureInfo[a]&&this.releaseCapture(a),this.captureInfo[a]=b;var c=document.createEvent("Event");c.initEvent("gotpointercapture",!0,!1),c.pointerId=a,this.implicitRelease=this.releaseCapture.bind(this,a),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease),c._target=b,this.asyncDispatchEvent(c)},releaseCapture:function(a){var b=this.captureInfo[a];if(b){var c=document.createEvent("Event");c.initEvent("lostpointercapture",!0,!1),c.pointerId=a,this.captureInfo[a]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease),c._target=b,this.asyncDispatchEvent(c)}},dispatchEvent:a.external.dispatchEvent||function(a){var b=this.getTarget(a);return b?b.dispatchEvent(a):void 0},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};e.boundHandler=e.eventHandler.bind(e),a.dispatcher=e,a.register=e.register.bind(e),a.unregister=e.unregister.bind(e)}(window.PointerEventsPolyfill),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("PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PointerEventsPolyfill),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","mouseover","mouseout"],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),d=c.preventDefault;return c.preventDefault=function(){a.preventDefault(),d()},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.cancel(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,a),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.move(c)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d&&d.button===a.button){var e=this.prepareEvent(a);b.up(e),this.cleanupMouse()}}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.enterOver(c)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.leaveOut(c)}},cancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanupMouse()},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PointerEventsPolyfill),function(a){var b,c=a.dispatcher,d=c.captureInfo,e=a.findTarget,f=a.targetFinding.allShadows.bind(a.targetFinding),g=c.pointermap,h=(Array.prototype.map.call.bind(Array.prototype.map),2500),i=200,j="touch-action",k=!1,l={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){k?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){k&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(j),d=this.touchActionToScrollType(b);d&&(a._scrollType=d,c.listen(a,this.events),f(a).forEach(function(a){a._scrollType=d,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),f(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(j),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);d&&e?(a._scrollType=d,f(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&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===g.pointers()||1===g.pointers()&&g.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,i)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,f=c.cloneEvent(a),g=f.pointerId=a.identifier+2;f.target=d[g]||e(f),f.bubbles=!0,f.cancelable=!0,f.detail=this.clickCount,f.button=0,f.buttons=this.typeToButtons(b.type),f.width=a.webkitRadiusX||a.radiusX||0,f.height=a.webkitRadiusY||a.radiusY||0,f.pressure=a.webkitForce||a.force||.5,f.isPrimary=this.isPrimaryTouch(a),f.pointerType=this.POINTER_TYPE;var h=this;return f.preventDefault=function(){h.scrolling=!1,h.firstXY=null,b.preventDefault()},f},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(g.pointers()>=b.length){var c=[];g.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.overDown))},overDown:function(a){g.set(a.pointerId,{target:a.target,out:a,outTarget:a.target});c.over(a),c.enter(a),c.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,d=g.get(b.pointerId);if(d){var e=d.out,f=d.outTarget;c.move(b),e&&f!==b.target&&(e.relatedTarget=b.target,b.relatedTarget=f,e.target=f,b.target?(c.leaveOut(e),c.enterOver(b)):(b.target=f,b.relatedTarget=null,this.cancelOut(b))),d.out=b,d.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(c.up(a),c.out(a),c.leave(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){c.cancel(a),c.out(a),c.leave(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){g["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 f=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(f,h)}}};k||(b=new a.Installer(l.elementAdded,l.elementRemoved,l.elementChanged,l)),a.touchEvents=l}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],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){c.set(a.pointerId,a);var d=this.prepareEvent(a);b.down(d)},MSPointerMove:function(a){var c=this.prepareEvent(a);b.move(c)},MSPointerUp:function(a){var c=this.prepareEvent(a);b.up(c),this.cleanup(a.pointerId)},MSPointerOut:function(a){var c=this.prepareEvent(a);b.leaveOut(c)},MSPointerOver:function(a){var c=this.prepareEvent(a);b.enterOver(c)},MSPointerCancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var c=b.makeEvent("lostpointercapture",a);b.dispatchEvent(c)},MSGotPointerCapture:function(a){var c=b.makeEvent("gotpointercapture",a);b.dispatchEvent(c)}};a.msEvents=e}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher;if(window.PointerEvent!==a.PointerEvent){if(window.navigator.msPointerEnabled){var c=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:c,enumerable:!0}),b.registerSource("ms",a.msEvents)}else b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents);b.register(document)}}(window.PointerEventsPolyfill),function(a){function b(a){if(!e.pointermap.has(a))throw new Error("InvalidPointerId")}var c,d,e=a.dispatcher,f=window.navigator;f.msPointerEnabled?(c=function(a){b(a),this.msSetPointerCapture(a)},d=function(a){b(a),this.msReleasePointerCapture(a)}):(c=function(a){b(a),e.setCapture(a,this)},d=function(a){b(a),e.releaseCapture(a,this)}),window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:c},releasePointerCapture:{value:d}})}(window.PointerEventsPolyfill),PointerGestureEvent.prototype.preventTap=function(){this.tapPrevented=!0},function(a){a=a||{},a.utils={LCA:{find:function(a,b){if(a===b)return a;if(a.contains){if(a.contains(b))return a;if(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;b>c;c++)a=a.parentNode;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode;return b}}},a.findLCA=function(b,c){return a.utils.LCA.find(b,c)},window.PointerGestures=a}(window.PointerGestures),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.PointerGestures),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","screenX","screenY","pageX","pageY","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],d={handledEvents:new WeakMap,targets:new WeakMap,handlers:{},recognizers:{},events:{},registerRecognizer:function(a,b){var c=b;this.recognizers[a]=c,c.events.forEach(function(a){if(c[a]){this.events[a]=!0;var b=c[a].bind(c);this.addHandler(a,b)}},this)},addHandler:function(a,b){var c=a;this.handlers[c]||(this.handlers[c]=[]),this.handlers[c].push(b)},registerTarget:function(a){this.listen(Object.keys(this.events),a)},unregisterTarget:function(a){this.unlisten(Object.keys(this.events),a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.handlers[b];c&&this.makeQueue(c,a),this.handledEvents.set(a,!0)}},makeQueue:function(a,b){var c=this.cloneEvent(b);requestAnimationFrame(this.runQueue.bind(this,a,c))},runQueue:function(a,b){this.currentPointerId=b.pointerId;for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)c(b);this.currentPointerId=0},listen:function(a,b){a.forEach(function(a){this.addEvent(a,this.boundHandler,!1,b)},this)},unlisten:function(a){a.forEach(function(a){this.removeEvent(a,this.boundHandler,!1,inTarget)},this)},addEvent:function(a,b,c,d){d.addEventListener(a,b,c)},removeEvent:function(a,b,c,d){d.removeEventListener(a,b,c)},makeEvent:function(a,b){return new PointerGestureEvent(a,b)},cloneEvent:function(a){for(var d,e={},f=0;f<b.length;f++)d=b[f],e[d]=a[d]||c[f];return e},dispatchEvent:function(a,b){var c=b||this.targets.get(a);c&&(c.dispatchEvent(a),a.tapPrevented&&this.preventTap(this.currentPointerId))},asyncDispatchEvent:function(a,b){requestAnimationFrame(this.dispatchEvent.bind(this,a,b))},preventTap:function(a){var b=this.recognizers.tap;b&&b.preventTap(a)}};d.boundHandler=d.eventHandler.bind(d),d.registerQueue=[],d.immediateRegister=!1,a.dispatcher=d,a.register=function(b){if(d.immediateRegister){var c=window.PointerEventsPolyfill;c&&c.register(b),a.dispatcher.registerTarget(b)}else d.registerQueue.push(b)},a.register(document)}(window.PointerGestures),function(a){var b=a.dispatcher,c={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["pointerdown","pointermove","pointerup","pointercancel"],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},pointerdown:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},pointerup:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},pointercancel:function(){this.cancel()},pointermove: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,c){var d={pointerType:this.heldPointer.pointerType,clientX:this.heldPointer.clientX,clientY:this.heldPointer.clientY};c&&(d.holdTime=c);var e=b.makeEvent(a,d);b.dispatchEvent(e,this.target),e.tapPrevented&&b.preventTap(this.heldPointer.pointerId)}};b.registerRecognizer("hold",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],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,c,d){var e=d,f=this.calcPositionDelta(e.downEvent,c),g=this.calcPositionDelta(e.lastMoveEvent,c);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h={dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX,pageY:c.pageY,screenX:c.screenX,screenY:c.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:c.target,pointerType:c.pointerType},i=b.makeEvent(a,h);e.lastMoveEvent=c,b.dispatchEvent(i,e.downTarget)},pointerdown: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};c.set(a.pointerId,b)}},pointermove:function(a){var b=c.get(a.pointerId);if(b)if(b.tracking)this.fireTrack("track",a,b);else{var d=this.calcPositionDelta(b.downEvent,a),e=d.x*d.x+d.y*d.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}},pointerup:function(a){var b=c.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),c.delete(a.pointerId))},pointercancel:function(a){this.pointerup(a)}};b.registerRecognizer("track",d)}(window.PointerGestures),function(a){var b=a.dispatcher,c={MIN_VELOCITY:.5,MAX_QUEUE:4,moveQueue:[],target:null,pointerId:null,events:["pointerdown","pointermove","pointerup","pointercancel"],pointerdown:function(a){a.isPrimary&&!this.pointerId&&(this.pointerId=a.pointerId,this.target=a.target,this.addMove(a))},pointermove:function(a){a.pointerId===this.pointerId&&this.addMove(a)},pointerup:function(a){a.pointerId===this.pointerId&&this.fireFlick(a),this.cleanup()},pointercancel:function(){this.cleanup()},cleanup:function(){this.moveQueue=[],this.target=null,this.pointerId=null},addMove:function(a){this.moveQueue.length>=this.MAX_QUEUE&&this.moveQueue.shift(),this.moveQueue.push(a)},fireFlick:function(a){for(var c,d,e,f,g,h,i,j=a,k=this.moveQueue.length,l=0,m=0,n=0,o=0;k>o&&(i=this.moveQueue[o]);o++)c=j.timeStamp-i.timeStamp,d=j.clientX-i.clientX,e=j.clientY-i.clientY,f=d/c,g=e/c,h=Math.sqrt(f*f+g*g),h>n&&(l=f,m=g,n=h);var p=Math.abs(l)>Math.abs(m)?"x":"y",q=this.calcAngle(l,m);if(Math.abs(n)>=this.MIN_VELOCITY){var r=b.makeEvent("flick",{xVelocity:l,yVelocity:m,velocity:n,angle:q,majorAxis:p,pointerType:a.pointerType});b.dispatchEvent(r,this.target)}},calcAngle:function(a,b){return 180*Math.atan2(b,a)/Math.PI}};b.registerRecognizer("flick",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d=180/Math.PI,e={events:["pointerdown","pointermove","pointerup","pointercancel"],reference:{},pointerdown:function(b){if(c.set(b.pointerId,b),2==c.pointers()){var d=this.calcChord(),e=this.calcAngle(d);this.reference={angle:e,diameter:d.diameter,target:a.findLCA(d.a.target,d.b.target)}}},pointerup:function(a){c.delete(a.pointerId)},pointermove:function(a){c.has(a.pointerId)&&(c.set(a.pointerId,a),c.pointers()>1&&this.calcPinchRotate())},pointercancel:function(a){this.pointerup(a)},dispatchPinch:function(a,c){var d=a/this.reference.diameter,e=b.makeEvent("pinch",{scale:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},dispatchRotate:function(a,c){var d=Math.round((a-this.reference.angle)%360),e=b.makeEvent("rotate",{angle:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.dispatchPinch(b,a),c!=this.reference.angle&&this.dispatchRotate(c,a)},calcChord:function(){var a=[];c.forEach(function(b){a.push(b)});for(var b,d,e,f=0,g={a:a[0],b:a[1]},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),d=Math.abs(i.clientY-k.clientY),e=b+d,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,d=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:d},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*d)%360}};b.registerRecognizer("pinch",e)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel","keyup"],pointerdown:function(a){a.isPrimary&&!a.tapPrevented&&c.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},pointermove:function(a){if(a.isPrimary){var b=c.get(a.pointerId);b&&a.tapPrevented&&c.delete(a.pointerId)}},shouldTap:function(a,b){return a.tapPrevented?void 0:"mouse"===a.pointerType?1===b.buttons:!0},pointerup:function(d){var e=c.get(d.pointerId);if(e&&this.shouldTap(d,e)){var f=a.findLCA(e.target,d.target);if(f){var g=b.makeEvent("tap",{x:d.clientX,y:d.clientY,detail:d.detail,pointerType:d.pointerType});b.dispatchEvent(g,f)}}c.delete(d.pointerId)},pointercancel:function(a){c.delete(a.pointerId)},keyup:function(a){var c=a.keyCode;if(32===c){var d=a.target;d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||b.dispatchEvent(b.makeEvent("tap",{x:0,y:0,detail:0,pointerType:"unavailable"}),d)}},preventTap:function(a){c.delete(a)}};b.registerRecognizer("tap",d)}(window.PointerGestures),function(a){function b(){c.immediateRegister=!0;var b=c.registerQueue;b.forEach(a.register),b.length=0}var c=a.dispatcher;"complete"===document.readyState?b():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&b()})}(window.PointerGestures),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)};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(J[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(L);h(a)&&b(a),E(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("");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];I[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){N?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(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!==H&&g!==F&&g!==G){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,H,c),d.bind=x(a,F,c),d.repeat=x(a,G,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",F,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){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var D,E=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?D=a.Map:(D=function(){this.keys=[],this.values=[]},D.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 F="bind",G="repeat",H="if",I={template:!0,repeat:!0,bind:!0,ref:!0},J={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},K="undefined"!=typeof HTMLTemplateElement;K&&!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 L="template, "+Object.keys(J).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),K||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var M,N="__proto__"in{};"function"==typeof MutationObserver&&(M=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)&&K,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=K,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=K)),!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 O=a.HTMLUnknownElement||HTMLElement,P={get:function(){return this.content_},enumerable:!0,configurable:!0};K||(HTMLTemplateElement.prototype=Object.create(O.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",P)),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 C(this)),this.iterator_.updateDependencies(a,this.model_),M&&M.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)),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return Q;var e=this.bindingMap_;e&&e.content===d||(e=B(d,c&&c.prepareBinding)||[],e.content=d,this.bindingMap_=e);var 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)}}return a?{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}}),Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var Q=document.createDocumentFragment();Q.bindings_=[],Q.terminator_=null,C.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(H,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(G,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(F,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 D,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!==Q&&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?Q: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!==Q&&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){"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&&" ᠎              ".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=t[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),t[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){"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.dynamicDeps="function"==typeof a||a.dynamic,this.dynamic="function"==typeof b||b.dynamic||"["==c,this.simplePath=!this.dynamic&&!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){return"o"===a[0]&&"n"===a[1]&&"-"===a[2]}function o(a,b){for(;a[x]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[x];return a}function p(a,b){if(0==b.length)return void 0;if(1==b.length)return o(a,b[0]);for(var c=0;null!=a&&c<b.length-1;c++)a=a[b[c]];return a}function q(a,b,c){var d=b.substring(3);return d=w[d]||d,function(b,e,f){function g(){return"{{ "+a+" }}"}var h,i,j;return j="function"==typeof c.resolveEventHandler?function(d){h=h||c.resolveEventHandler(b,a,e),h(d,d.detail,d.currentTarget),Platform&&"function"==typeof Platform.flush&&Platform.flush()}:function(c){h=h||a.getValueFrom(b),i=i||p(b,a,e),h.apply(i,[c,c.detail,c.currentTarget]),Platform&&"function"==typeof Platform.flush&&Platform.flush()},e.addEventListener(d,j),f?void 0:{open:g,discardChanges:g,close:function(){e.removeEventListener(d,j)}}}}function r(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function s(){}var t=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=o(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 u={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},v={"+":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(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return u[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!v[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return v[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 w={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){w[a.toLowerCase()]=a});var x="@"+Math.random().toString(36).slice(2);s.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(n(c))return e.valid?q(e,c,this):void console.error("on-* bindings must be simple path expressions");{if(r(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=o(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[x]=c,e}}}},a.PolymerExpressions=s,a.exposeGetExpression&&(a.getExpression_=c),a.PolymerExpressions.prepareEventBinding=q}(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..33e82bd 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":"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","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":["../PointerGestures/src/PointerGestureEvent.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/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","../PointerEvents/src/boot.js","../PointerEvents/src/touch-action.js","../PointerEvents/src/PointerEvent.js","../PointerEvents/src/pointermap.js","../PointerEvents/src/dispatcher.js","../PointerEvents/src/installer.js","../PointerEvents/src/mouse.js","../PointerEvents/src/touch.js","../PointerEvents/src/ms.js","../PointerEvents/src/platform-events.js","../PointerEvents/src/capture.js","../PointerGestures/src/initialize.js","../PointerGestures/src/pointermap.js","../PointerGestures/src/dispatcher.js","../PointerGestures/src/hold.js","../PointerGestures/src/track.js","../PointerGestures/src/flick.js","../PointerGestures/src/pinch.js","../PointerGestures/src/tap.js","../PointerGestures/src/registerScopes.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/patches-mdv.js"],"names":[],"mappings":"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","sourcesContent":["/*\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 * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\n};\n\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 document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\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);\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  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 emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!obj)\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\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        observedSetCache.push(this);\n      },\n      reset: scheduleReset\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);\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.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\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_ = path instanceof Path ? 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() {\n    Observer.call(this);\n\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      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\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 (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: 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    },\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      this.closeObservers_();\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      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\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.closeObservers_();\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 pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\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 notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify('update', oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\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.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","// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript ||\r\n      document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\r\n    console.warn('platform.js is not the first script on the page. ' +\r\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\r\n        'for details.');\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\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  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\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    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\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  // 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    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\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  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\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   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\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.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 isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\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  }\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      case 'beforeunload':\n      case 'load':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window \"load\" events the \"load\" event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document &&\n        isLoadLikeEvent(event)) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\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 = adjustRelatedTarget(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    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 === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.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 (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\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].currentTarget;\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    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\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.adjustRelatedTarget = adjustRelatedTarget;\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 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  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\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\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  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 findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\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 findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\n      return result;\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    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    // TODO: attribute boolean resetStyleInheritance;\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 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  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\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    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\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 distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.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  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.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    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.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  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      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\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    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\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    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\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 assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\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 = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.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.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\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\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\n  registerWrapper(OriginalWindow, 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 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  // 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 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\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.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\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  // 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 * 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  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\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  window.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})();","/* 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 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// 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);","// Copyright 2011 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(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 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// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\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\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(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","(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 * 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\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 */\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) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, 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      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\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'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = 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.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\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('/');\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      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(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')) :\n      link.__importParsed;\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        nativePrototype = Object.getPrototypeOf(inst);\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        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\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 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\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 2014 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  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\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      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\n","/*\n * Copyright 2014 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\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, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\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\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, 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, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\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  scope = scope || {};\n  scope.external = scope.external || {};\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      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  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\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  function shadowSelector(v) {\n    return 'body /shadow-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 + '; touch-action-delay: none; }';\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 hasNativePE = window.PointerEvent || window.MSPointerEvent;\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasNativePE) {\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 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 * 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  function PointerEvent(inType, inDict) {\n    inDict = inDict || Object.create(null);\n\n    var e = document.createEvent('Event');\n    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n\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  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\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 * 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.PointerEventsPolyfill);\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  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  ];\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  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\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    captureInfo: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\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    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    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents 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._handledByPE) {\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._handledByPE = 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: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.removeEvent || function(target, eventName) {\n      target.removeEventListener(eventName, this.boundHandler);\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      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo[inEvent.pointerId]) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\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 (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      return this.captureInfo[inEvent.pointerId] || inEvent._target;\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo[inPointerId]) {\n        this.releaseCapture(inPointerId);\n      }\n      this.captureInfo[inPointerId] = inTarget;\n      var e = document.createEvent('Event');\n      e.initEvent('gotpointercapture', true, false);\n      e.pointerId = inPointerId;\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      e._target = inTarget;\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      var t = this.captureInfo[inPointerId];\n      if (t) {\n        var e = document.createEvent('Event');\n        e.initEvent('lostpointercapture', true, false);\n        e.pointerId = inPointerId;\n        this.captureInfo[inPointerId] = undefined;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        e._target = t;\n        this.asyncDispatchEvent(e);\n      }\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: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\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 * 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('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\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  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      'mouseover',\n      'mouseout'\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      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\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.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var captureInfo = dispatcher.captureInfo;\n  var findTarget = scope.findTarget;\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  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = 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 (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\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    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 = captureInfo[id] || findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\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.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\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.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\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_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\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  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      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\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      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\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 * 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  // only activate if this platform does not have pointer events\n  if (window.PointerEvent !== scope.PointerEvent) {\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\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  }\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\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   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\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; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\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 * 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.PointerGestures);\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  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    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\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  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\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 = {}, 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      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\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 * 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 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      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\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    pointerdown: 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    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: 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        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\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 trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.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.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: 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     pointermove: 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       }\n     },\n     pointerup: 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     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\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 * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: 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    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\n","/*\n * Copyright 2014 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 * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\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  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\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\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 = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\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        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    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  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) 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  // 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  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    // 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.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\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  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\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 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 resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\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      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\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  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\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 */\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 1cc75cd..82efc01 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.3.5
+version: 0.3.4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index b783228..50fc3db 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,5 +1,5 @@
 name: yaml
-version: 1.0.0+2
+version: 1.0.0+1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: A parser for YAML.
@@ -9,4 +9,4 @@
 dev_dependencies:
   unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=1.5.0-dev.0.0 <2.0.0"
+  sdk: ">=0.8.10+6 <2.0.0"
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 440bccc..13b7938 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -938,7 +938,6 @@
   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");
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index cbd86a8..c811f31 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -50,10 +50,21 @@
       },
       # Added by Dart.
       'Dart_x64_Base': {
-        'defines': [
-          'NSS_X86_OR_X64',
-          'NSS_X64',
-          'NSS_USE_64',
+        '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',
+          ]}],
         ],
       },
       # Added by Dart.
@@ -78,32 +89,7 @@
               # 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',
@@ -447,14 +433,13 @@
             ['exclude', 'nspr/pr/src/md/unix/'],
             ['exclude', 'nspr/pr/src/pthreads/'],
           ],
-          # Changed by Dart. We don't use target_arch.
-          # 'conditions': [
-          #  ['target_arch=="ia32"', {
-          #    'defines': [
-          #      '_X86_',
-          #    ],
-          #  }],
-          # ],
+          'conditions': [
+            ['target_arch=="ia32"', {
+              'defines': [
+                '_X86_',
+              ],
+            }],
+          ],
         }],
         ['component == "static_library"', {
           'defines': [
@@ -609,7 +594,6 @@
       # 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',
@@ -1322,43 +1306,38 @@
           },
           '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',
           ],
-          # 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',
-          #     ],
-          #    }],
-          # ],
+          '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 0d3cb11..85b6694 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -59,10 +59,8 @@
 }
 
 
-void Platform::FreeEnvironment(char** env, intptr_t count) {
-  for (intptr_t i = 0; i < count; i++) {
-    free(env[i]);
-  }
+void Platform::FreeEnvironment(char** env, int count) {
+  for (int i = 0; i < count; i++) free(env[i]);
   delete[] env;
 }
 
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 9471c5a..926cc31 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 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(
+  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(
       intptr_t fd, const void* buffer, intptr_t num_bytes, RawAddr addr);
-  static intptr_t RecvFrom(
+  static int 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 96175cf..56a065d 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -101,7 +101,7 @@
 }
 
 
-intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+int 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 @@
 }
 
 
-intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 6e8b4aa..aaff4d9 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -94,7 +94,7 @@
 }
 
 
-intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+int 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 @@
 }
 
 
-intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index db39707..04a1413 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -103,7 +103,7 @@
 }
 
 
-intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+int 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 @@
 }
 
 
-intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+int 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 @@
 }
 
 
-intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 18156e6..5ec7f1f 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -76,7 +76,7 @@
 }
 
 
-intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+int 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 @@
 }
 
 
-intptr_t Socket::SendTo(
+int 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/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index c87c8a7..45640c8 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -659,16 +659,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &amp;&amp;
                        ref['closureFunc'] != null}}">
-        <a on-click="{{ goto }}" href="{{ url }}">
+        <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
@@ -676,7 +676,7 @@
 
       <template if="{{ isInstance(ref.serviceType) &amp;&amp;
                        ref['closureFunc'] == null}}">
-        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ field in ref['fields'] }}">
@@ -694,7 +694,7 @@
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
-        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
@@ -1054,7 +1054,7 @@
     </style>
 
     <li class="menu">
-      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -1102,7 +1102,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+    <li><a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -1138,31 +1138,9 @@
   </template>
 </polymer-element>
 
-<polymer-element name="nav-control" extends="observatory-element">
-  <template>
-    <style>
-      .black {
-        color: #000;
-      }
-      li {
-        float: right;
-        margin: 0;
-      }
-      li button {
-        margin: 3px;
-        padding: 8px;
-      }
-    </style>
-    <li>
-      <button class="black" on-click="{{ back }}">◀</button>
-      <button class="black" on-click="{{ forward }}">▶</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>
@@ -1171,11 +1149,11 @@
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.relativeLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}" anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
@@ -1183,7 +1161,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.link }}" anchor="{{ library.name }}" last="{{ last }}">
+    <nav-menu link="{{ library.hashLink }}" anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -1191,7 +1169,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.link }}" anchor="{{ cls.name }}" last="{{ last }}">
+    <nav-menu link="{{ cls.hashLink }}" anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -1439,9 +1417,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('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>
@@ -1699,363 +1676,11 @@
 .break-wrap {
   word-wrap: break-word;
 }
-</style><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
 
-
-
-
-<polymer-element name="class-tree" extends="observatory-element">
-  <template>
-    <style>
-/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
-    <style>
-      .table {
-        border-collapse: collapse!important;
-        width: 100%;
-        margin-bottom: 20px
-      }
-      .table thead > tr > th,
-      .table tbody > tr > th,
-      .table tfoot > tr > th,
-      .table thead > tr > td,
-      .table tbody > tr > td,
-      .table tfoot > tr > td {
-        padding: 8px;
-        vertical-align: top;
-      }
-      .table thead > tr > th {
-        vertical-align: bottom;
-        text-align: left;
-        border-bottom:2px solid #ddd;
-      }
-
-      tr:hover > td {
-        background-color: #FFF3E3;
-      }
-      .rowColor0 {
-        background-color: #FFE9CC;
-      }
-      .rowColor1 {
-        background-color: #FFDEB2;
-      }
-      .rowColor2 {
-        background-color: #FFD399;
-      }
-      .rowColor3 {
-        background-color: #FFC87F;
-      }
-      .rowColor4 {
-        background-color: #FFBD66;
-      }
-      .rowColor5 {
-        background-color: #FFB24C;
-      }
-      .rowColor6 {
-        background-color: #FFA733;
-      }
-      .rowColor7 {
-        background-color: #FF9C19;
-      }
-      .rowColor8 {
-        background-color: #FF9100;
-      }
-
-      .tooltip {
-        display: block;
-        position: absolute;
-        visibility: hidden;
-        opacity: 0;
-        transition: visibility 0s linear 0.5s;
-        transition: opacity .4s ease-in-out;
-      }
-
-      tr:hover .tooltip {
-        display: block;
-        position: absolute;
-        top: 100%;
-        right: 100%;
-        visibility: visible;
-        z-index: 999;
-        width: 400px;
-        color: #ffffff;
-        background-color: #0489c3;
-        border-top-right-radius: 8px;
-        border-top-left-radius: 8px;
-        border-bottom-right-radius: 8px;
-        border-bottom-left-radius: 8px;
-        transition: visibility 0s linear 0.5s;
-        transition: opacity .4s ease-in-out;
-        opacity: 1;
-      }
-
-      .white {
-        color: #ffffff;
-      }
-    </style>
-    <nav-bar>
-      <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
-    </nav-bar>
-    <div class="content-centered">
-      <h1>Class Hierarchy</h1>
-      <table id="tableTree" class="table">
-        <thead>
-          <tr>
-            <th>Class</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr template="" repeat="{{row in tree.rows }}">
-            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
-              <class-ref ref="{{ row.cls }}"></class-ref>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-  </template>
-</polymer-element>
-
-
-
   
   
   
@@ -2430,7 +2055,7 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
   
@@ -2681,7 +2306,7 @@
      --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 
 </polymer-element>
@@ -2925,10 +2550,10 @@
 }
 </style>
   <template if="{{ nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    <a href="{{ url }}">unnamed</a>
   </template>
   <template if="{{ !nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
 
@@ -3174,7 +2799,7 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 
 </polymer-element>
@@ -3419,18 +3044,17 @@
     <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.isAbstract }}">
+        <template if="{{ cls['abstract'] }}">
           abstract
         </template>
-        <template if="{{ cls.isPatch }}">
+        <template if="{{ cls['patch'] }}">
           patch
         </template>
         class {{ cls.name }}
@@ -3439,32 +3063,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.superClass != null }}">
+        <template if="{{ cls['super'] != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls['super'] }}"></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>
@@ -3473,11 +3097,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>
@@ -3498,19 +3122,19 @@
       </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>
@@ -3526,11 +3150,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 }}">
@@ -3795,10 +3419,10 @@
 </style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
+          <a href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+          <a href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
@@ -4100,7 +3724,6 @@
       <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 &amp;&amp; code.isOptimized }}">
@@ -4465,7 +4088,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -4730,9 +4352,8 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -5321,9 +4942,8 @@
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content-centered">
@@ -5905,9 +5525,8 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -6259,9 +5878,8 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('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>
@@ -6521,7 +6139,6 @@
     <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">
@@ -6531,7 +6148,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -6539,7 +6156,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
         </li>
       </ul>
 
@@ -6547,7 +6164,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
         </li>
       </ul>
 
@@ -6555,7 +6172,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -6563,7 +6180,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
         </li>
       </ul>
 
@@ -7326,7 +6943,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -7845,7 +7462,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -8680,7 +8297,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -9445,7 +9062,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -10481,10 +10098,10 @@
 }
 </style>
     <template if="{{ small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+      <a href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
@@ -10804,6 +10421,7 @@
 
 
 
+
 <polymer-element name="isolate-ref" extends="service-ref">
 <template><style>
 /* Global styles */
@@ -11041,10 +10659,10 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-</polymer-element>
 
+</polymer-element>
 
   
   
@@ -11658,33 +11276,28 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            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>
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
           </div>
         </div>
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
         </template>
@@ -11966,7 +11579,6 @@
       <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">
@@ -12037,7 +11649,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
@@ -12332,7 +11944,6 @@
       <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 }}">
@@ -12758,7 +12369,6 @@
       <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">
@@ -12885,6 +12495,9 @@
 
   
   
+
+  
+  
   
   
   
@@ -13175,11 +12788,10 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap 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">
@@ -13584,9 +13196,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
@@ -14013,8 +13624,8 @@
       </li>
     </nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    <nav-control></nav-control>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}">
@@ -14268,9 +13879,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('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">
@@ -14540,7 +14150,6 @@
     <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">
@@ -14565,7 +14174,7 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
+            See <a href="#/flags">flags</a>
           </div>
         </div>
       </div>
@@ -14590,8 +14199,15 @@
        an observable property on the old element to an invalid type. -->
   
 </polymer-element>
-<polymer-element name="observatory-application" extends="observatory-element">
-  <!-- This element explicitly manages its child elements -->
+<polymer-element name="response-viewer" extends="observatory-element">
+  <template>
+    <service-view object="{{ app.response }}"></service-view>
+  </template>
+  
+</polymer-element><polymer-element name="observatory-application" extends="observatory-element">
+  <template>
+    <response-viewer app="{{ this.app }}"></response-viewer>
+  </template>
   
 </polymer-element>
 
@@ -14837,7 +14453,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ exception.kind }}</h1>
@@ -15093,7 +14708,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -15342,7 +14956,7 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html._data b/runtime/bin/vmservice/client/deployed/web/index.html._data
index 05581be..244ac94 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html._data
+++ b/runtime/bin/vmservice/client/deployed/web/index.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/response_viewer.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 48a5056..7957a93 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
@@ -193,7 +193,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,65],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -208,20 +208,20 @@
 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]},
-QI:{
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,65]},
+wm:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 iC:{
-"^":"QI;"},
+"^":"wm;"},
 kdQ:{
-"^":"QI;"},
+"^":"wm;"},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
+W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
 xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
@@ -234,12 +234,12 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},28],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},28],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -256,7 +256,7 @@
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.j5(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
+geK:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -272,12 +272,12 @@
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.qo(a,b)},
 XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-kJ:function(a,b){return this.XU(a,b,0)},
+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
@@ -366,7 +366,7 @@
 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},
+KI: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
@@ -391,7 +391,7 @@
 gbx:function(a){return C.yT},
 $isFK:true,
 static:{"^":"SAz,N6l"}},
-Xh:{
+L7:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isCP:true,
@@ -475,7 +475,7 @@
 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},
-kJ:function(a,b){return this.XU(a,b,0)},
+u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -532,7 +532,7 @@
 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.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
+y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
@@ -545,9 +545,9 @@
 init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
-x=H.fH(y,[y]).BD(a)
+x=H.KT(y,[y]).BD(a)
 if(x)u.vV(0,new H.PK(z,a))
-else{y=H.fH(y,[y,y]).BD(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
@@ -564,7 +564,7 @@
 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
+Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Kh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
@@ -586,8 +586,20 @@
 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))
+case"spawn-worker":q=y.t(z,"functionName")
+m=y.t(z,"uri")
+p=y.t(z,"args")
+o=y.t(z,"msg")
+l=y.t(z,"isSpawnUri")
+k=y.t(z,"startPaused")
+y=y.t(z,"replyPort")
+if(m==null)m=$.Rs()
+j=new Worker(m)
+j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
+i=init.globalState.Y7++
+$.p6().u(0,j,i)
+init.globalState.XC.u(0,i,j)
+j.postMessage(H.t0(P.EF(["command","start","id",i,"replyTo",H.t0(y),"args",p,"msg",H.t0(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
 break
 case"message":if(y.t(z,"port")!=null)J.m9(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
@@ -611,41 +623,6 @@
 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.RY(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.tZ(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.vd
-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=$.Rs()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.cz(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.Jz(),P.Jz(),!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(new H.IY(w,new H.H5(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
@@ -654,15 +631,10 @@
 y=z.EE
 x=init.globalState.N0.jO
 w=z.um
-J.m9(f,["spawned",new H.ws(y,x),w,z.PX])
+J.m9(f,["spawned",new H.Ze(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(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","Hb",6,0,null,2,3,4],
 t0:function(a){var z
 if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.aJ(null)
@@ -674,18 +646,18 @@
 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",
+"^":"Tp:66;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:69;a,c",
+"^":"Tp:66;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,vd,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.ma()==null
-y=$.RG()
+"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
+i6:function(a){var z,y,x,w
+z=$.My()==null
+y=$.nB()
 x=z&&$.JU()===!0
 this.EF=x
 if(!x)y=y!=null&&$.Rs()!=null
@@ -696,7 +668,7 @@
 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.i2=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.vd=z
@@ -704,13 +676,13 @@
 $.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",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
+if(this.lJ.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=this.lJ
 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()
@@ -781,7 +753,7 @@
 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],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,67,68],
 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
@@ -805,7 +777,7 @@
 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)
+PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
 z=this.M2
@@ -813,14 +785,14 @@
 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)
+init.globalState.i2.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.m9(z.lo,null)
-this.CN=null}},"$0","gQb",0,0,18],
+this.CN=null}},"$0","gQb",0,0,15],
 $isaX:true},
 NY:{
-"^":"Tp:18;a",
+"^":"Tp:15;a",
 $0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -830,18 +802,18 @@
 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."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.vd
+if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-oV:function(){if($.ma()!=null)new H.QB(this).$0()
+Wu:function(){if($.My()!=null)new H.QB(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)
+if(init.globalState.EF!==!0)this.Wu()
+else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 w=init.globalState.vd
@@ -849,70 +821,44 @@
 w.toString
 self.postMessage(v)}}},
 QB:{
-"^":"Tp:18;a",
+"^":"Tp:15;a",
 $0:[function(){if(!this.a.xB())return
-P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
+P.ww(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,15],
 $isIY:true},
 JH:{
 "^":"a;"},
 mN:{
-"^":"Tp:69;a,b,c,d,e,f",
+"^":"Tp:66;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.m9(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.m9(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-tZ:{
-"^":"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.rC(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-cz:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.rC(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-H5:{
-"^":"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",
+"^":"Tp:15;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
 y=H.G3()
-x=H.fH(y,[y,y]).BD(z)
+x=H.KT(y,[y,y]).BD(z)
 if(x)z.$2(this.b,this.c)
-else{y=H.fH(y,[y]).BD(z)
+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;",
 $isRZ:true,
-$ishq:true},
-ws:{
+$iswC:true},
+Ze:{
 "^":"Iy4;JE,tv",
 wR:function(a,b){var z,y,x,w,v
 z={}
 y=this.tv
-x=init.globalState.iR.t(0,y)
+x=init.globalState.i2.t(0,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
@@ -924,13 +870,13 @@
 w="receive "+H.d(b)
 y.Rk.NZ(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)},
+return!!J.x(b).$isZe&&J.xC(this.JE,b.JE)},
 giO:function(a){return J.Mo(this.JE)},
-$isws:true,
+$isZe:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ua:{
-"^":"Tp:69;a,b,c",
+"^":"Tp:66;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -946,14 +892,14 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
+z=J.xs(this.ZU,16)
+y=J.xs(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isdd:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 yo:{
 "^":"a;x6>,D1,P0<",
 zd:function(a){return this.D1.$1(a)},
@@ -972,46 +918,32 @@
 this.zd(a)},
 $isyo:true,
 static:{"^":"Fd"}},
-A1:{
-"^":"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},
 RS:{
 "^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
+DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
 if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
 yf:function(a){if(!!a.$isiV)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 Qt:{
-"^":"Jl;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
+"^":"ooy;mR",
+DE:function(a){if(!!a.$isZe)return new H.Ze(a.JE,a.tv)
 if(!!a.$isdd)return new H.dd(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.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 BV:{
-"^":"fPc;RZ",
+"^":"lY;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(J.xC(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
 if(v==null)return
 u=v.iQ(w)
 if(u==null)return
-return new H.ws(u,x)}else return new H.dd(y,w,x)},
+return new H.Ze(u,x)}else return new H.dd(y,w,x)},
 Op:function(a){return new H.iV(J.UQ(a,1))}},
 aJ:{
 "^":"a;MD",
@@ -1040,12 +972,12 @@
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isZ0)return this.pi(a)
 if(!!z.$isRZ)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$iswC)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-Jl:{
+ooy:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x,w
@@ -1058,7 +990,7 @@
 this.mR.u(0,a,z)
 for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.mR.t(0,a)
 z.a=y
@@ -1071,7 +1003,7 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.b
 J.kW(this.a.a,z.Q9(a),z.Q9(b))},
 $isEH:true},
@@ -1084,7 +1016,7 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
 y=this.Ao++
@@ -1100,7 +1032,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
+lY:{
 "^":"a;",
 ug:function(a){if(H.ZR(a))return a
 this.RZ=P.YM(null,null,null,null,null)
@@ -1163,12 +1095,12 @@
 z.Qa(a,b)
 return z}}},
 Av:{
-"^":"Tp:18;a,b",
+"^":"Tp:15;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Wl:{
-"^":"Tp:18;c,d",
+"^":"Tp:15;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1193,7 +1125,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iswC:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1209,7 +1141,7 @@
 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],
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,2],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1295,7 +1227,7 @@
 return a.date},
 of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
-wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+R0:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1338,7 +1270,7 @@
 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],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",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)
@@ -1392,7 +1324,7 @@
 else if(z.n(c,2))return H.zd(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","dm",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","Q8",14,0,null,3,4,5,6,7,8,9],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1421,7 +1353,7 @@
 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
+else if(u&&typeof x=="function"){q=t?H.HY:H.dS
 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
@@ -1430,7 +1362,7 @@
 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
+vq:function(a,b,c,d){var z=H.dS
 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)
@@ -1459,7 +1391,7 @@
 $.OK=J.ew(w,1)
 return new Function(v+H.d(w)+"}")()},
 Z4:function(a,b,c,d){var z,y
-z=H.uj
+z=H.dS
 y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
@@ -1500,10 +1432,10 @@
 if(z)return a
 H.aE(a,b)},
 ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-fH:function(a,b,c){return new H.GN(a,b,c,null)},
+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.ac(z,b,null)},
+return new H.Tu(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
@@ -1620,17 +1552,17 @@
 ml:function(a,b,c){return a.apply(b,c)},
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-KS:function(a){return H.eQ(a)},
+wzi:function(a){return H.eQ(a)},
 bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
-y=$.q4[z]
+y=$.nw[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(z!=null){y=$.nw[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
@@ -1638,7 +1570,7 @@
 x=w.prototype
 v=z[0]
 if(v==="!"){y=H.Va(x)
-$.q4[z]=y
+$.nw[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)
@@ -1661,7 +1593,7 @@
 $.Bv=!0
 H.Z1()},
 Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
+$.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
 z=init.interceptorsByTag
@@ -1742,8 +1674,8 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,70,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1763,18 +1695,18 @@
 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)
+if(this.xI!==0)return P.Fl(P.IN,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)
+if(y===0)return P.Fl(P.IN,null)
+v=P.L5(null,null,null,P.IN,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},
+v.u(0,new H.GD(t),x[s])}return v},
 static:{"^":"hAw,eHF,zl"}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
@@ -1805,7 +1737,7 @@
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4,FV,OcN,yM",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,OcN,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1814,7 +1746,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Tp:5;a,b,c",
+"^":"Tp:2;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1823,14 +1755,14 @@
 z[y]=x},
 $isEH:true},
 lk:{
-"^":"Tp:77;a,b,c",
+"^":"Tp:71;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:77;a,b",
+"^":"Tp:71;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1890,7 +1822,7 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
@@ -1905,23 +1837,23 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:69;b,c",
+"^":"Tp:66;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:69;d,e,f",
+"^":"Tp:66;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
+"^":"Tp:66;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",
+"^":"Tp:66;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
@@ -1943,7 +1875,7 @@
 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
+static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
 if(z==null){z=H.Iq("self")
 $.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -2017,7 +1949,7 @@
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
 bu:function(a){return this.oc}},
-ac:{
+Tu:{
 "^":"lbp;oc>,re<,Et",
 za:function(){var z,y
 z=this.Et
@@ -2044,15 +1976,15 @@
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"Tp:78;b",
+"^":"Tp:72;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 vZ:{
-"^":"Tp:5;c",
+"^":"Tp:2;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
@@ -2094,7 +2026,11 @@
 if(y[w]!=null)return
 C.Nm.sB(y,w)
 return H.Mr(this,y)},
-wL:function(a,b,c){if(c<0||c>J.q8(b))throw H.b(P.TE(c,0,J.q8(b)))
+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,
@@ -2155,10 +2091,10 @@
 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)},
-pp:[function(a,b,c,d){var z=a.fi
+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).wM(new X.jE(a))}},"$3","gNa",6,0,79,46,47,80],
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,73,43,44,74],
 static:{zy:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -2175,10 +2111,10 @@
 C.Gx.XI(a)
 return a}}},
 LPc:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:69;a",
+"^":"Tp:66;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,{
@@ -2187,7 +2123,7 @@
 N.QM("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.ca(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
+return z},"$1","vN",2,0,10,11],
 dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
@@ -2199,7 +2135,7 @@
 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],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,12],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2215,7 +2151,7 @@
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,15,16],
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,12,13],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2227,92 +2163,27 @@
 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(){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;i6,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){this.i6.wv.cv(a).ml(new G.zv(this))},
-LQ:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.Mi(this.a.yF,a)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;i6,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.i6.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-LQ: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,82,"call"],
-$isEH:true},
-dx:{
-"^":"uG;i6,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.i6.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-LQ:function(a){return J.co(a,"error/")}},
 mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,wC,EC,fz,AP,fn",
+"^":"Pi;Z6,wv>,Eb,AJ,fz,AP,fn",
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
+gbA:function(a){return this.AJ},
+sbA:function(a,b){this.AJ=F.Wi(this,C.F3,this.AJ,b)},
 Da:function(){var z,y
-this.om()
+z=this.Z6
+z.ec=this
+z.kI()
 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.Hj.Ph,!1),[null])
-H.VM(new W.fd(0,y.bi,y.Ph,W.aF(z.gbQ()),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.dx(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.mQ("error/")},"$1","gbf",2,0,83,24],
-t1:[function(a){this.EC=a
-this.mQ("error/")},"$1","gXa",2,0,84,85],
-mQ:function(a){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.LQ(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.a9())},
-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.wC
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
+H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
+kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gbf",2,0,75,21],
+t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gXa",2,0,76,77],
+US:function(){this.Da()},
+hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
@@ -2326,32 +2197,37 @@
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
 this.vR.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){if(J.Qe(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-this.ec.mQ(a)},
-f7:[function(a){window.history.go(-1)},"$0","gSk",0,0,18],
-og:[function(a){window.history.go(1)},"$0","gWc",0,0,18],
-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.gAE(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)}},
-ng:{
-"^":"yVe;hS,ec,c5,R9,V2,me",
-Cy:function(){var z="/"+H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="/#"+this.hS
-window.history.replaceState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,86,14]},
+hq:{
+"^":"Pi;ec,JL,AP,fn",
+kI:function(){var z=H.VM(new W.RO(window,C.yZ.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
+if(window.location.hash==="")window.location.hash="#/vm"
+else this.df()},
+df:function(){var z,y,x
+z=window.location.hash
+z=F.Wi(this,C.M8,this.JL,z)
+this.JL=z
+if(!J.co(z,"#/"))return
+y=J.ZZ(this.JL,2).split("#")
+z=y.length
+if(0>=z)return H.e(y,0)
+x=z>1?y[1]:""
+if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
+this.ec.wv.cv(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
+static:{"^":"K3D"}},
+Qe:{
+"^":"Tp:10;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,78,"call"],
+$isEH:true},
+wX:{
+"^":"Tp:10;a,b",
+$1:[function(a){var z,y
+z=this.a
+y=z.ec
+y.AJ=F.Wi(y,C.F3,y.AJ,a)
+z=z.ec
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,79,"call"],
+$isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
@@ -2369,17 +2245,11 @@
 $isY2:true},
 XN:{
 "^":"Pi;WT>,AP,fn",
-rT:function(a){var z,y
-z=this.WT
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
 qU:function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.kJ(z,x)+1,J.Mx(x))
+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)
@@ -2389,11 +2259,11 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-v=w.kJ(z,a)+1
+v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-zb:{
+Ktd:{
 "^":"a;ph>,xy<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","HP",2,0,14]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2417,19 +2287,19 @@
 y=J.UQ(J.U8o(z[a]),b)
 z=this.oH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gwy",4,0,87,88,89],
+return z[b].gxy().$1(y)},"$2","gwy",4,0,80,81,82],
 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],
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,82],
 TK:[function(a,b){var z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,90,88,89]},
+return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,83,81,82]},
 BD:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){var z,y,x,w
 z=this.a
 y=z.WT
@@ -2442,1631 +2312,1603 @@
 $isEH:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
 E24:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.ET,new E.Cv(),C.Ph,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.fV,new E.e25(),C.jU,new E.e26(),C.Gd,new E.e27(),C.OO,new E.e28(),C.Mc,new E.e29(),C.FP,new E.e30(),C.kF,new E.e31(),C.UD,new E.e32(),C.Aq,new E.e33(),C.DS,new E.e34(),C.C9,new E.e35(),C.VF,new E.e36(),C.uU,new E.e37(),C.YJ,new E.e38(),C.eF,new E.e39(),C.oI,new E.e40(),C.ST,new E.e41(),C.Uj,new E.e42(),C.QH,new E.e43(),C.qX,new E.e44(),C.rE,new E.e45(),C.nf,new E.e46(),C.pO,new E.e47(),C.EI,new E.e48(),C.JB,new E.e49(),C.Uq,new E.e50(),C.A8,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.ak,new E.e57(),C.Ge,new E.e58(),C.He,new E.e59(),C.wq,new E.e60(),C.k6,new E.e61(),C.oj,new E.e62(),C.PJ,new E.e63(),C.Ms,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.eJ,new E.e69(),C.iG,new E.e70(),C.Py,new E.e71(),C.pC,new E.e72(),C.uu,new E.e73(),C.qs,new E.e74(),C.h7,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.kA,new E.e102(),C.Wn,new E.e103(),C.ur,new E.e104(),C.VN,new E.e105(),C.EV,new E.e106(),C.VI,new E.e107(),C.eh,new E.e108(),C.SA,new E.e109(),C.kV,new E.e110(),C.vp,new E.e111(),C.cc,new E.e112(),C.DY,new E.e113(),C.Lx,new E.e114(),C.M3,new E.e115(),C.wT,new E.e116(),C.SR,new E.e117(),C.t6,new E.e118(),C.rP,new E.e119(),C.pX,new E.e120(),C.VD,new E.e121(),C.NN,new E.e122(),C.UX,new E.e123(),C.YS,new E.e124(),C.pu,new E.e125(),C.So,new E.e126(),C.EK,new E.e127(),C.td,new E.e128(),C.Gn,new E.e129(),C.zO,new E.e130(),C.eH,new E.e131(),C.ap,new E.e132(),C.Ys,new E.e133(),C.zm,new E.e134(),C.XM,new E.e135(),C.Ic,new E.e136(),C.yG,new E.e137(),C.tW,new E.e138(),C.CG,new E.e139(),C.Wj,new E.e140(),C.vb,new E.e141(),C.UL,new E.e142(),C.AY,new E.e143(),C.QK,new E.e144(),C.AO,new E.e145(),C.I7,new E.e146(),C.xP,new E.e147(),C.Wm,new E.e148(),C.GR,new E.e149(),C.KX,new E.e150(),C.ja,new E.e151(),C.Dj,new E.e152(),C.ir,new E.e153(),C.yL,new E.e154(),C.ni,new E.e155(),C.X2,new E.e156(),C.F3,new E.e157(),C.UY,new E.e158(),C.Aa,new E.e159(),C.nY,new E.e160(),C.HD,new E.e161(),C.iU,new E.e162(),C.eN,new E.e163(),C.ue,new E.e164(),C.nh,new E.e165(),C.L2,new E.e166(),C.Gs,new E.e167(),C.bE,new E.e168(),C.YD,new E.e169(),C.PX,new E.e170(),C.N8,new E.e171(),C.EA,new E.e172(),C.oW,new E.e173(),C.hd,new E.e174(),C.XY,new E.e175(),C.kz,new E.e176(),C.pH,new E.e177(),C.Ve,new E.e178(),C.jM,new E.e179(),C.DW,new E.e180(),C.PM,new E.e181(),C.k5,new E.e182(),C.Nv,new E.e183(),C.Cw,new E.e184(),C.TW,new E.e185(),C.xS,new E.e186(),C.mi,new E.e187(),C.zz,new E.e188(),C.hO,new E.e189(),C.ei,new E.e190(),C.HK,new E.e191(),C.je,new E.e192(),C.hN,new E.e193(),C.Q1,new E.e194(),C.ID,new E.e195(),C.z6,new E.e196(),C.bc,new E.e197(),C.kw,new E.e198(),C.ep,new E.e199(),C.J2,new E.e200(),C.zU,new E.e201(),C.bn,new E.e202(),C.mh,new E.e203(),C.Fh,new E.e204(),C.jh,new E.e205(),C.fj,new E.e206(),C.xw,new E.e207(),C.zn,new E.e208(),C.RJ,new E.e209(),C.Tc,new E.e210(),C.YE,new E.e211(),C.Uy,new E.e212()],null,null)
-y=P.EF([C.aP,new E.e213(),C.cg,new E.e214(),C.S4,new E.e215(),C.AV,new E.e216(),C.bk,new E.e217(),C.lH,new E.e218(),C.kG,new E.e219(),C.XA,new E.e220(),C.i4,new E.e221(),C.bJ,new E.e222(),C.WZ,new E.e223(),C.VK,new E.e224(),C.aH,new E.e225(),C.PI,new E.e226(),C.Gr,new E.e227(),C.tP,new E.e228(),C.yh,new E.e229(),C.Zb,new E.e230(),C.ne,new E.e231(),C.B0,new E.e232(),C.mr,new E.e233(),C.YT,new E.e234(),C.WQ,new E.e235(),C.jU,new E.e236(),C.Gd,new E.e237(),C.OO,new E.e238(),C.Mc,new E.e239(),C.QH,new E.e240(),C.rE,new E.e241(),C.nf,new E.e242(),C.Ql,new E.e243(),C.ak,new E.e244(),C.Ge,new E.e245(),C.He,new E.e246(),C.oj,new E.e247(),C.Ms,new E.e248(),C.d2,new E.e249(),C.fn,new E.e250(),C.Py,new E.e251(),C.uu,new E.e252(),C.qs,new E.e253(),C.a0,new E.e254(),C.rB,new E.e255(),C.Lc,new E.e256(),C.hf,new E.e257(),C.uk,new E.e258(),C.kA,new E.e259(),C.ur,new E.e260(),C.EV,new E.e261(),C.eh,new E.e262(),C.SA,new E.e263(),C.kV,new E.e264(),C.vp,new E.e265(),C.SR,new E.e266(),C.t6,new E.e267(),C.UX,new E.e268(),C.YS,new E.e269(),C.td,new E.e270(),C.zO,new E.e271(),C.Ys,new E.e272(),C.XM,new E.e273(),C.Ic,new E.e274(),C.tW,new E.e275(),C.Wj,new E.e276(),C.vb,new E.e277(),C.QK,new E.e278(),C.AO,new E.e279(),C.xP,new E.e280(),C.GR,new E.e281(),C.KX,new E.e282(),C.ja,new E.e283(),C.Dj,new E.e284(),C.X2,new E.e285(),C.UY,new E.e286(),C.Aa,new E.e287(),C.nY,new E.e288(),C.HD,new E.e289(),C.iU,new E.e290(),C.eN,new E.e291(),C.Gs,new E.e292(),C.bE,new E.e293(),C.YD,new E.e294(),C.PX,new E.e295(),C.XY,new E.e296(),C.pH,new E.e297(),C.Ve,new E.e298(),C.jM,new E.e299(),C.PM,new E.e300(),C.Nv,new E.e301(),C.Cw,new E.e302(),C.TW,new E.e303(),C.mi,new E.e304(),C.zz,new E.e305(),C.z6,new E.e306(),C.kw,new E.e307(),C.zU,new E.e308(),C.RJ,new E.e309(),C.YE,new E.e310()],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.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.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.j2,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],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.by],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.j2,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.j2,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.pH,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.xY,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.j2,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.VK,C.m8],null,null),C.l4,C.CM,C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.ET,"assertsEnabled",C.Ph,"back",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.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.Uj,"forward",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",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.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",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.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.jU,new E.e25(),C.Gd,new E.e26(),C.OO,new E.e27(),C.Mc,new E.e28(),C.FP,new E.e29(),C.kF,new E.e30(),C.UD,new E.e31(),C.Aq,new E.e32(),C.DS,new E.e33(),C.C9,new E.e34(),C.VF,new E.e35(),C.uU,new E.e36(),C.YJ,new E.e37(),C.eF,new E.e38(),C.oI,new E.e39(),C.ST,new E.e40(),C.QH,new E.e41(),C.qX,new E.e42(),C.rE,new E.e43(),C.nf,new E.e44(),C.pO,new E.e45(),C.EI,new E.e46(),C.JB,new E.e47(),C.Uq,new E.e48(),C.A8,new E.e49(),C.Ql,new E.e50(),C.SI,new E.e51(),C.zS,new E.e52(),C.ak,new E.e53(),C.eo,new E.e54(),C.Ge,new E.e55(),C.He,new E.e56(),C.wq,new E.e57(),C.k6,new E.e58(),C.oj,new E.e59(),C.PJ,new E.e60(),C.Ms,new E.e61(),C.q2,new E.e62(),C.d2,new E.e63(),C.kN,new E.e64(),C.fn,new E.e65(),C.eJ,new E.e66(),C.iG,new E.e67(),C.Py,new E.e68(),C.uu,new E.e69(),C.qs,new E.e70(),C.h7,new E.e71(),C.I9,new E.e72(),C.C1,new E.e73(),C.a0,new E.e74(),C.Yg,new E.e75(),C.bR,new E.e76(),C.ai,new E.e77(),C.ob,new E.e78(),C.Iv,new E.e79(),C.Wg,new E.e80(),C.tD,new E.e81(),C.nZ,new E.e82(),C.Of,new E.e83(),C.pY,new E.e84(),C.LA,new E.e85(),C.Lk,new E.e86(),C.dK,new E.e87(),C.xf,new E.e88(),C.rB,new E.e89(),C.bz,new E.e90(),C.Jx,new E.e91(),C.b5,new E.e92(),C.Lc,new E.e93(),C.hf,new E.e94(),C.uk,new E.e95(),C.kA,new E.e96(),C.Wn,new E.e97(),C.ur,new E.e98(),C.VN,new E.e99(),C.EV,new E.e100(),C.VI,new E.e101(),C.eh,new E.e102(),C.SA,new E.e103(),C.kV,new E.e104(),C.vp,new E.e105(),C.cc,new E.e106(),C.DY,new E.e107(),C.Lx,new E.e108(),C.M3,new E.e109(),C.wT,new E.e110(),C.SR,new E.e111(),C.t6,new E.e112(),C.rP,new E.e113(),C.pX,new E.e114(),C.VD,new E.e115(),C.NN,new E.e116(),C.UX,new E.e117(),C.YS,new E.e118(),C.pu,new E.e119(),C.So,new E.e120(),C.EK,new E.e121(),C.td,new E.e122(),C.Gn,new E.e123(),C.zO,new E.e124(),C.eH,new E.e125(),C.ap,new E.e126(),C.Ys,new E.e127(),C.zm,new E.e128(),C.XM,new E.e129(),C.Ic,new E.e130(),C.yG,new E.e131(),C.tW,new E.e132(),C.CG,new E.e133(),C.Wj,new E.e134(),C.vb,new E.e135(),C.UL,new E.e136(),C.AY,new E.e137(),C.QK,new E.e138(),C.AO,new E.e139(),C.I7,new E.e140(),C.xP,new E.e141(),C.Wm,new E.e142(),C.GR,new E.e143(),C.KX,new E.e144(),C.ja,new E.e145(),C.Dj,new E.e146(),C.Gi,new E.e147(),C.yL,new E.e148(),C.ni,new E.e149(),C.X2,new E.e150(),C.F3,new E.e151(),C.UY,new E.e152(),C.Aa,new E.e153(),C.nY,new E.e154(),C.HD,new E.e155(),C.iU,new E.e156(),C.eN,new E.e157(),C.ue,new E.e158(),C.nh,new E.e159(),C.L2,new E.e160(),C.Gs,new E.e161(),C.bE,new E.e162(),C.YD,new E.e163(),C.PX,new E.e164(),C.N8,new E.e165(),C.EA,new E.e166(),C.oW,new E.e167(),C.hd,new E.e168(),C.XY,new E.e169(),C.kz,new E.e170(),C.fV,new E.e171(),C.Ve,new E.e172(),C.jM,new E.e173(),C.DW,new E.e174(),C.PM,new E.e175(),C.Nv,new E.e176(),C.TW,new E.e177(),C.xS,new E.e178(),C.mi,new E.e179(),C.zz,new E.e180(),C.hO,new E.e181(),C.ei,new E.e182(),C.HK,new E.e183(),C.je,new E.e184(),C.hN,new E.e185(),C.Q1,new E.e186(),C.ID,new E.e187(),C.z6,new E.e188(),C.bc,new E.e189(),C.kw,new E.e190(),C.ep,new E.e191(),C.J2,new E.e192(),C.zU,new E.e193(),C.bn,new E.e194(),C.mh,new E.e195(),C.Fh,new E.e196(),C.jh,new E.e197(),C.fj,new E.e198(),C.xw,new E.e199(),C.zn,new E.e200(),C.RJ,new E.e201(),C.Tc,new E.e202(),C.YE,new E.e203(),C.Uy,new E.e204()],null,null)
+y=P.EF([C.aP,new E.e205(),C.cg,new E.e206(),C.j2,new E.e207(),C.S4,new E.e208(),C.AV,new E.e209(),C.bk,new E.e210(),C.lH,new E.e211(),C.kG,new E.e212(),C.XA,new E.e213(),C.i4,new E.e214(),C.bJ,new E.e215(),C.WZ,new E.e216(),C.VK,new E.e217(),C.aH,new E.e218(),C.PI,new E.e219(),C.Gr,new E.e220(),C.tP,new E.e221(),C.yh,new E.e222(),C.Zb,new E.e223(),C.ne,new E.e224(),C.B0,new E.e225(),C.mr,new E.e226(),C.YT,new E.e227(),C.WQ,new E.e228(),C.jU,new E.e229(),C.Gd,new E.e230(),C.OO,new E.e231(),C.Mc,new E.e232(),C.QH,new E.e233(),C.rE,new E.e234(),C.nf,new E.e235(),C.Ql,new E.e236(),C.ak,new E.e237(),C.eo,new E.e238(),C.Ge,new E.e239(),C.He,new E.e240(),C.oj,new E.e241(),C.Ms,new E.e242(),C.d2,new E.e243(),C.fn,new E.e244(),C.Py,new E.e245(),C.uu,new E.e246(),C.qs,new E.e247(),C.a0,new E.e248(),C.rB,new E.e249(),C.Lc,new E.e250(),C.hf,new E.e251(),C.uk,new E.e252(),C.kA,new E.e253(),C.ur,new E.e254(),C.EV,new E.e255(),C.eh,new E.e256(),C.SA,new E.e257(),C.kV,new E.e258(),C.vp,new E.e259(),C.SR,new E.e260(),C.t6,new E.e261(),C.UX,new E.e262(),C.YS,new E.e263(),C.td,new E.e264(),C.zO,new E.e265(),C.Ys,new E.e266(),C.XM,new E.e267(),C.Ic,new E.e268(),C.tW,new E.e269(),C.Wj,new E.e270(),C.vb,new E.e271(),C.QK,new E.e272(),C.AO,new E.e273(),C.xP,new E.e274(),C.GR,new E.e275(),C.KX,new E.e276(),C.ja,new E.e277(),C.Dj,new E.e278(),C.X2,new E.e279(),C.F3,new E.e280(),C.UY,new E.e281(),C.Aa,new E.e282(),C.nY,new E.e283(),C.HD,new E.e284(),C.iU,new E.e285(),C.eN,new E.e286(),C.Gs,new E.e287(),C.bE,new E.e288(),C.YD,new E.e289(),C.PX,new E.e290(),C.XY,new E.e291(),C.fV,new E.e292(),C.Ve,new E.e293(),C.jM,new E.e294(),C.PM,new E.e295(),C.Nv,new E.e296(),C.TW,new E.e297(),C.mi,new E.e298(),C.zz,new E.e299(),C.z6,new E.e300(),C.kw,new E.e301(),C.zU,new E.e302(),C.RJ,new E.e303(),C.YE,new E.e304()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.fV,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.fV,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.LT(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383()]
+$.M6=[new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376()]
 $.UG=!0
-F.E2()},"$0","vS",0,0,18],
+F.E2()},"$0","vS",0,0,15],
 em:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
+"^":"Tp:10;",
+$1:function(a){return J.un(a)},
 $isEH:true},
 ed:{
-"^":"Tp:13;",
-$1:function(a){return J.Im(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gA3()},
 $isEH:true},
 wa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 Or:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 YL:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 wf:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 Oa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 emv:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Lbd:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 QAa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.hn(a)},
 $isEH:true},
 CvS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 edy:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 waE:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gaP()},
 $isEH:true},
 Ore:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.E3(a)},
 $isEH:true},
 YLa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.on(a)},
 $isEH:true},
 wfa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.SM(a)},
 $isEH:true},
 Oaa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.goH()},
 $isEH:true},
 e0:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.OT(a)},
 $isEH:true},
 e1:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ok(a)},
 $isEH:true},
 e2:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.wd(a)},
 $isEH:true},
 e3:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.RC(a)},
 $isEH:true},
 e4:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gSL()},
 $isEH:true},
 e5:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.guH()},
 $isEH:true},
 e6:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.mP(a)},
 $isEH:true},
 e7:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.BT(a)},
 $isEH:true},
 e8:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yA(a)},
 $isEH:true},
 e9:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.vi(a)},
 $isEH:true},
 e10:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gFL()},
 $isEH:true},
 e11:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.rw(a)},
 $isEH:true},
 e12:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gw2()},
 $isEH:true},
 e13:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.w8(a)},
 $isEH:true},
 e14:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.is(a)},
 $isEH:true},
 e15:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yi(a)},
 $isEH:true},
 e16:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Vl(a)},
 $isEH:true},
 e17:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.kE(a)},
 $isEH:true},
 e18:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ak(a)},
 $isEH:true},
 e19:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Mz(a)},
 $isEH:true},
 e20:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.S9(a)},
 $isEH:true},
 e21:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gty()},
 $isEH:true},
 e22:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yn(a)},
 $isEH:true},
 e23:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gkE()},
 $isEH:true},
 e24:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.pm(a)},
 $isEH:true},
 e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
+"^":"Tp:10;",
+$1:function(a){return J.WA(a)},
 $isEH:true},
 e26:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.ghY()},
 $isEH:true},
-e28:{
-"^":"Tp:13;",
+e27:{
+"^":"Tp:10;",
 $1:function(a){return J.ra(a)},
 $isEH:true},
-e29:{
-"^":"Tp:13;",
+e28:{
+"^":"Tp:10;",
 $1:function(a){return J.QZ(a)},
 $isEH:true},
-e30:{
-"^":"Tp:13;",
+e29:{
+"^":"Tp:10;",
 $1:function(a){return J.WX(a)},
 $isEH:true},
-e31:{
-"^":"Tp:13;",
+e30:{
+"^":"Tp:10;",
 $1:function(a){return J.JD(a)},
 $isEH:true},
-e32:{
-"^":"Tp:13;",
+e31:{
+"^":"Tp:10;",
 $1:function(a){return a.gZd()},
 $isEH:true},
-e33:{
-"^":"Tp:13;",
+e32:{
+"^":"Tp:10;",
 $1:function(a){return J.lT(a)},
 $isEH:true},
-e34:{
-"^":"Tp:13;",
+e33:{
+"^":"Tp:10;",
 $1:function(a){return J.M4(a)},
 $isEH:true},
-e35:{
-"^":"Tp:13;",
+e34:{
+"^":"Tp:10;",
 $1:function(a){return a.gkA()},
 $isEH:true},
-e36:{
-"^":"Tp:13;",
+e35:{
+"^":"Tp:10;",
 $1:function(a){return a.gGK()},
 $isEH:true},
-e37:{
-"^":"Tp:13;",
+e36:{
+"^":"Tp:10;",
 $1:function(a){return a.gan()},
 $isEH:true},
-e38:{
-"^":"Tp:13;",
+e37:{
+"^":"Tp:10;",
 $1:function(a){return a.gcQ()},
 $isEH:true},
-e39:{
-"^":"Tp:13;",
+e38:{
+"^":"Tp:10;",
 $1:function(a){return a.gS7()},
 $isEH:true},
-e40:{
-"^":"Tp:13;",
+e39:{
+"^":"Tp:10;",
 $1:function(a){return a.gP3()},
 $isEH:true},
-e41:{
-"^":"Tp:13;",
+e40:{
+"^":"Tp:10;",
 $1:function(a){return J.PY(a)},
 $isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return J.Oq(a)},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
+e41:{
+"^":"Tp:10;",
 $1:function(a){return J.bu(a)},
 $isEH:true},
-e44:{
-"^":"Tp:13;",
+e42:{
+"^":"Tp:10;",
 $1:function(a){return J.VL(a)},
 $isEH:true},
-e45:{
-"^":"Tp:13;",
+e43:{
+"^":"Tp:10;",
 $1:function(a){return J.zN(a)},
 $isEH:true},
-e46:{
-"^":"Tp:13;",
+e44:{
+"^":"Tp:10;",
 $1:function(a){return J.m4(a)},
 $isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
+e45:{
+"^":"Tp:10;",
+$1:function(a){return J.WY(a)},
 $isEH:true},
-e48:{
-"^":"Tp:13;",
+e46:{
+"^":"Tp:10;",
 $1:function(a){return a.gmu()},
 $isEH:true},
-e49:{
-"^":"Tp:13;",
+e47:{
+"^":"Tp:10;",
 $1:function(a){return a.gCO()},
 $isEH:true},
-e50:{
-"^":"Tp:13;",
+e48:{
+"^":"Tp:10;",
 $1:function(a){return a.gwy()},
 $isEH:true},
-e51:{
-"^":"Tp:13;",
+e49:{
+"^":"Tp:10;",
 $1:function(a){return a.gyY()},
 $isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.bL(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
+e50:{
+"^":"Tp:10;",
 $1:function(a){return J.wO(a)},
 $isEH:true},
-e55:{
-"^":"Tp:13;",
+e51:{
+"^":"Tp:10;",
 $1:function(a){return a.gGf()},
 $isEH:true},
-e56:{
-"^":"Tp:13;",
+e52:{
+"^":"Tp:10;",
 $1:function(a){return a.gUa()},
 $isEH:true},
-e57:{
-"^":"Tp:13;",
+e53:{
+"^":"Tp:10;",
 $1:function(a){return J.u1(a)},
 $isEH:true},
-e58:{
-"^":"Tp:13;",
+e54:{
+"^":"Tp:10;",
+$1:function(a){return a.gHP()},
+$isEH:true},
+e55:{
+"^":"Tp:10;",
 $1:function(a){return J.z3(a)},
 $isEH:true},
-e59:{
-"^":"Tp:13;",
+e56:{
+"^":"Tp:10;",
 $1:function(a){return J.YQ(a)},
 $isEH:true},
-e60:{
-"^":"Tp:13;",
+e57:{
+"^":"Tp:10;",
 $1:function(a){return J.Hr(a)},
 $isEH:true},
-e61:{
-"^":"Tp:13;",
+e58:{
+"^":"Tp:10;",
 $1:function(a){return J.fA(a)},
 $isEH:true},
-e62:{
-"^":"Tp:13;",
+e59:{
+"^":"Tp:10;",
 $1:function(a){return J.cd(a)},
 $isEH:true},
-e63:{
-"^":"Tp:13;",
+e60:{
+"^":"Tp:10;",
 $1:function(a){return a.gL4()},
 $isEH:true},
-e64:{
-"^":"Tp:13;",
+e61:{
+"^":"Tp:10;",
 $1:function(a){return J.pB(a)},
 $isEH:true},
-e65:{
-"^":"Tp:13;",
+e62:{
+"^":"Tp:10;",
 $1:function(a){return a.gaj()},
 $isEH:true},
-e66:{
-"^":"Tp:13;",
+e63:{
+"^":"Tp:10;",
 $1:function(a){return a.giq()},
 $isEH:true},
-e67:{
-"^":"Tp:13;",
+e64:{
+"^":"Tp:10;",
 $1:function(a){return a.gBm()},
 $isEH:true},
-e68:{
-"^":"Tp:13;",
+e65:{
+"^":"Tp:10;",
 $1:function(a){return J.xR(a)},
 $isEH:true},
-e69:{
-"^":"Tp:13;",
+e66:{
+"^":"Tp:10;",
 $1:function(a){return a.gNI()},
 $isEH:true},
-e70:{
-"^":"Tp:13;",
+e67:{
+"^":"Tp:10;",
 $1:function(a){return a.gva()},
 $isEH:true},
-e71:{
-"^":"Tp:13;",
+e68:{
+"^":"Tp:10;",
 $1:function(a){return a.gKt()},
 $isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
+e69:{
+"^":"Tp:10;",
 $1:function(a){return J.ns(a)},
 $isEH:true},
-e74:{
-"^":"Tp:13;",
+e70:{
+"^":"Tp:10;",
 $1:function(a){return J.Ew(a)},
 $isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return a.gOj()},
+e71:{
+"^":"Tp:10;",
+$1:function(a){return a.gwg()},
 $isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
+e72:{
+"^":"Tp:10;",
 $1:function(a){return J.Ja(a)},
 $isEH:true},
-e78:{
-"^":"Tp:13;",
+e73:{
+"^":"Tp:10;",
 $1:function(a){return a.gUB()},
 $isEH:true},
-e79:{
-"^":"Tp:13;",
+e74:{
+"^":"Tp:10;",
 $1:function(a){return J.pd(a)},
 $isEH:true},
-e80:{
-"^":"Tp:13;",
+e75:{
+"^":"Tp:10;",
 $1:function(a){return a.gkU()},
 $isEH:true},
-e81:{
-"^":"Tp:13;",
+e76:{
+"^":"Tp:10;",
 $1:function(a){return J.wz(a)},
 $isEH:true},
-e82:{
-"^":"Tp:13;",
+e77:{
+"^":"Tp:10;",
 $1:function(a){return J.tx(a)},
 $isEH:true},
-e83:{
-"^":"Tp:13;",
+e78:{
+"^":"Tp:10;",
 $1:function(a){return J.ls(a)},
 $isEH:true},
-e84:{
-"^":"Tp:13;",
+e79:{
+"^":"Tp:10;",
 $1:function(a){return J.yq(a)},
 $isEH:true},
-e85:{
-"^":"Tp:13;",
+e80:{
+"^":"Tp:10;",
 $1:function(a){return J.SZ(a)},
 $isEH:true},
-e86:{
-"^":"Tp:13;",
+e81:{
+"^":"Tp:10;",
 $1:function(a){return J.DL(a)},
 $isEH:true},
-e87:{
-"^":"Tp:13;",
+e82:{
+"^":"Tp:10;",
 $1:function(a){return J.yx(a)},
 $isEH:true},
-e88:{
-"^":"Tp:13;",
+e83:{
+"^":"Tp:10;",
 $1:function(a){return J.cU(a)},
 $isEH:true},
-e89:{
-"^":"Tp:13;",
+e84:{
+"^":"Tp:10;",
 $1:function(a){return a.gYG()},
 $isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
+e85:{
+"^":"Tp:10;",
 $1:function(a){return a.gHY()},
 $isEH:true},
-e92:{
-"^":"Tp:13;",
+e86:{
+"^":"Tp:10;",
 $1:function(a){return J.UM(a)},
 $isEH:true},
-e93:{
-"^":"Tp:13;",
+e87:{
+"^":"Tp:10;",
 $1:function(a){return J.ZN(a)},
 $isEH:true},
-e94:{
-"^":"Tp:13;",
+e88:{
+"^":"Tp:10;",
 $1:function(a){return J.xa(a)},
 $isEH:true},
-e95:{
-"^":"Tp:13;",
+e89:{
+"^":"Tp:10;",
 $1:function(a){return J.aT(a)},
 $isEH:true},
-e96:{
-"^":"Tp:13;",
+e90:{
+"^":"Tp:10;",
 $1:function(a){return J.hb(a)},
 $isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
+e91:{
+"^":"Tp:10;",
+$1:function(a){return a.gi2()},
 $isEH:true},
-e98:{
-"^":"Tp:13;",
+e92:{
+"^":"Tp:10;",
 $1:function(a){return a.gEB()},
 $isEH:true},
-e99:{
-"^":"Tp:13;",
+e93:{
+"^":"Tp:10;",
 $1:function(a){return J.Iz(a)},
 $isEH:true},
-e100:{
-"^":"Tp:13;",
+e94:{
+"^":"Tp:10;",
 $1:function(a){return J.Q4(a)},
 $isEH:true},
-e101:{
-"^":"Tp:13;",
+e95:{
+"^":"Tp:10;",
 $1:function(a){return J.MQ(a)},
 $isEH:true},
-e102:{
-"^":"Tp:13;",
+e96:{
+"^":"Tp:10;",
 $1:function(a){return a.gSK()},
 $isEH:true},
-e103:{
-"^":"Tp:13;",
+e97:{
+"^":"Tp:10;",
 $1:function(a){return J.q8(a)},
 $isEH:true},
-e104:{
-"^":"Tp:13;",
+e98:{
+"^":"Tp:10;",
 $1:function(a){return a.ghX()},
 $isEH:true},
-e105:{
-"^":"Tp:13;",
+e99:{
+"^":"Tp:10;",
 $1:function(a){return a.gvU()},
 $isEH:true},
-e106:{
-"^":"Tp:13;",
+e100:{
+"^":"Tp:10;",
 $1:function(a){return J.jl(a)},
 $isEH:true},
-e107:{
-"^":"Tp:13;",
+e101:{
+"^":"Tp:10;",
 $1:function(a){return a.gRd()},
 $isEH:true},
-e108:{
-"^":"Tp:13;",
+e102:{
+"^":"Tp:10;",
 $1:function(a){return J.zY(a)},
 $isEH:true},
-e109:{
-"^":"Tp:13;",
+e103:{
+"^":"Tp:10;",
 $1:function(a){return J.de(a)},
 $isEH:true},
-e110:{
-"^":"Tp:13;",
+e104:{
+"^":"Tp:10;",
 $1:function(a){return J.Ds(a)},
 $isEH:true},
-e111:{
-"^":"Tp:13;",
+e105:{
+"^":"Tp:10;",
 $1:function(a){return J.cO(a)},
 $isEH:true},
-e112:{
-"^":"Tp:13;",
+e106:{
+"^":"Tp:10;",
 $1:function(a){return a.gzM()},
 $isEH:true},
-e113:{
-"^":"Tp:13;",
+e107:{
+"^":"Tp:10;",
 $1:function(a){return a.gn0()},
 $isEH:true},
-e114:{
-"^":"Tp:13;",
+e108:{
+"^":"Tp:10;",
 $1:function(a){return a.giP()},
 $isEH:true},
-e115:{
-"^":"Tp:13;",
+e109:{
+"^":"Tp:10;",
 $1:function(a){return a.gLw()},
 $isEH:true},
-e116:{
-"^":"Tp:13;",
+e110:{
+"^":"Tp:10;",
 $1:function(a){return a.geH()},
 $isEH:true},
-e117:{
-"^":"Tp:13;",
+e111:{
+"^":"Tp:10;",
 $1:function(a){return J.Yf(a)},
 $isEH:true},
-e118:{
-"^":"Tp:13;",
+e112:{
+"^":"Tp:10;",
 $1:function(a){return J.kv(a)},
 $isEH:true},
-e119:{
-"^":"Tp:13;",
+e113:{
+"^":"Tp:10;",
 $1:function(a){return J.ih(a)},
 $isEH:true},
-e120:{
-"^":"Tp:13;",
+e114:{
+"^":"Tp:10;",
 $1:function(a){return J.z2(a)},
 $isEH:true},
-e121:{
-"^":"Tp:13;",
+e115:{
+"^":"Tp:10;",
 $1:function(a){return J.ZL(a)},
 $isEH:true},
-e122:{
-"^":"Tp:13;",
+e116:{
+"^":"Tp:10;",
 $1:function(a){return J.ba(a)},
 $isEH:true},
-e123:{
-"^":"Tp:13;",
+e117:{
+"^":"Tp:10;",
 $1:function(a){return J.Zv(a)},
 $isEH:true},
-e124:{
-"^":"Tp:13;",
+e118:{
+"^":"Tp:10;",
 $1:function(a){return J.O6(a)},
 $isEH:true},
-e125:{
-"^":"Tp:13;",
+e119:{
+"^":"Tp:10;",
 $1:function(a){return J.HO(a)},
 $isEH:true},
-e126:{
-"^":"Tp:13;",
+e120:{
+"^":"Tp:10;",
 $1:function(a){return a.gxs()},
 $isEH:true},
-e127:{
-"^":"Tp:13;",
+e121:{
+"^":"Tp:10;",
 $1:function(a){return a.gCi()},
 $isEH:true},
-e128:{
-"^":"Tp:13;",
+e122:{
+"^":"Tp:10;",
 $1:function(a){return J.Jj(a)},
 $isEH:true},
-e129:{
-"^":"Tp:13;",
+e123:{
+"^":"Tp:10;",
 $1:function(a){return J.t8(a)},
 $isEH:true},
-e130:{
-"^":"Tp:13;",
+e124:{
+"^":"Tp:10;",
 $1:function(a){return a.gL1()},
 $isEH:true},
-e131:{
-"^":"Tp:13;",
+e125:{
+"^":"Tp:10;",
 $1:function(a){return a.gQB()},
 $isEH:true},
-e132:{
-"^":"Tp:13;",
+e126:{
+"^":"Tp:10;",
 $1:function(a){return a.guq()},
 $isEH:true},
-e133:{
-"^":"Tp:13;",
+e127:{
+"^":"Tp:10;",
 $1:function(a){return J.EC(a)},
 $isEH:true},
-e134:{
-"^":"Tp:13;",
+e128:{
+"^":"Tp:10;",
 $1:function(a){return J.JG(a)},
 $isEH:true},
-e135:{
-"^":"Tp:13;",
+e129:{
+"^":"Tp:10;",
 $1:function(a){return J.AF(a)},
 $isEH:true},
-e136:{
-"^":"Tp:13;",
+e130:{
+"^":"Tp:10;",
 $1:function(a){return J.LB(a)},
 $isEH:true},
-e137:{
-"^":"Tp:13;",
+e131:{
+"^":"Tp:10;",
 $1:function(a){return J.Kl(a)},
 $isEH:true},
-e138:{
-"^":"Tp:13;",
+e132:{
+"^":"Tp:10;",
 $1:function(a){return J.io(a)},
 $isEH:true},
-e139:{
-"^":"Tp:13;",
+e133:{
+"^":"Tp:10;",
 $1:function(a){return J.fy(a)},
 $isEH:true},
-e140:{
-"^":"Tp:13;",
+e134:{
+"^":"Tp:10;",
 $1:function(a){return J.Qa(a)},
 $isEH:true},
-e141:{
-"^":"Tp:13;",
+e135:{
+"^":"Tp:10;",
 $1:function(a){return J.ks(a)},
 $isEH:true},
-e142:{
-"^":"Tp:13;",
+e136:{
+"^":"Tp:10;",
 $1:function(a){return J.Hf(a)},
 $isEH:true},
-e143:{
-"^":"Tp:13;",
+e137:{
+"^":"Tp:10;",
 $1:function(a){return J.WM(a)},
 $isEH:true},
-e144:{
-"^":"Tp:13;",
+e138:{
+"^":"Tp:10;",
 $1:function(a){return J.Pr(a)},
 $isEH:true},
-e145:{
-"^":"Tp:13;",
+e139:{
+"^":"Tp:10;",
 $1:function(a){return J.Sz(a)},
 $isEH:true},
-e146:{
-"^":"Tp:13;",
+e140:{
+"^":"Tp:10;",
 $1:function(a){return a.gm8()},
 $isEH:true},
-e147:{
-"^":"Tp:13;",
+e141:{
+"^":"Tp:10;",
 $1:function(a){return J.Gc(a)},
 $isEH:true},
-e148:{
-"^":"Tp:13;",
+e142:{
+"^":"Tp:10;",
 $1:function(a){return J.Dd(a)},
 $isEH:true},
-e149:{
-"^":"Tp:13;",
+e143:{
+"^":"Tp:10;",
 $1:function(a){return J.Cm(a)},
 $isEH:true},
-e150:{
-"^":"Tp:13;",
+e144:{
+"^":"Tp:10;",
 $1:function(a){return J.AK(a)},
 $isEH:true},
-e151:{
-"^":"Tp:13;",
+e145:{
+"^":"Tp:10;",
 $1:function(a){return J.tF(a)},
 $isEH:true},
-e152:{
-"^":"Tp:13;",
+e146:{
+"^":"Tp:10;",
 $1:function(a){return J.QX(a)},
 $isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
+e147:{
+"^":"Tp:10;",
+$1:function(a){return a.gw6()},
 $isEH:true},
-e154:{
-"^":"Tp:13;",
+e148:{
+"^":"Tp:10;",
 $1:function(a){return a.gNS()},
 $isEH:true},
-e155:{
-"^":"Tp:13;",
+e149:{
+"^":"Tp:10;",
 $1:function(a){return a.guh()},
 $isEH:true},
-e156:{
-"^":"Tp:13;",
+e150:{
+"^":"Tp:10;",
 $1:function(a){return J.iL(a)},
 $isEH:true},
-e157:{
-"^":"Tp:13;",
+e151:{
+"^":"Tp:10;",
 $1:function(a){return J.jP(a)},
 $isEH:true},
-e158:{
-"^":"Tp:13;",
+e152:{
+"^":"Tp:10;",
 $1:function(a){return J.uW(a)},
 $isEH:true},
-e159:{
-"^":"Tp:13;",
+e153:{
+"^":"Tp:10;",
 $1:function(a){return J.W2(a)},
 $isEH:true},
-e160:{
-"^":"Tp:13;",
+e154:{
+"^":"Tp:10;",
 $1:function(a){return J.UT(a)},
 $isEH:true},
-e161:{
-"^":"Tp:13;",
+e155:{
+"^":"Tp:10;",
 $1:function(a){return J.jH(a)},
 $isEH:true},
-e162:{
-"^":"Tp:13;",
+e156:{
+"^":"Tp:10;",
 $1:function(a){return J.jo(a)},
 $isEH:true},
-e163:{
-"^":"Tp:13;",
+e157:{
+"^":"Tp:10;",
 $1:function(a){return a.gVc()},
 $isEH:true},
-e164:{
-"^":"Tp:13;",
+e158:{
+"^":"Tp:10;",
 $1:function(a){return a.gpF()},
 $isEH:true},
-e165:{
-"^":"Tp:13;",
+e159:{
+"^":"Tp:10;",
 $1:function(a){return J.oL(a)},
 $isEH:true},
-e166:{
-"^":"Tp:13;",
+e160:{
+"^":"Tp:10;",
 $1:function(a){return a.gA6()},
 $isEH:true},
-e167:{
-"^":"Tp:13;",
+e161:{
+"^":"Tp:10;",
 $1:function(a){return J.Ry(a)},
 $isEH:true},
-e168:{
-"^":"Tp:13;",
+e162:{
+"^":"Tp:10;",
 $1:function(a){return J.UP(a)},
 $isEH:true},
-e169:{
-"^":"Tp:13;",
+e163:{
+"^":"Tp:10;",
 $1:function(a){return J.fw(a)},
 $isEH:true},
-e170:{
-"^":"Tp:13;",
+e164:{
+"^":"Tp:10;",
 $1:function(a){return J.zH(a)},
 $isEH:true},
-e171:{
-"^":"Tp:13;",
+e165:{
+"^":"Tp:10;",
 $1:function(a){return J.Vi(a)},
 $isEH:true},
-e172:{
-"^":"Tp:13;",
+e166:{
+"^":"Tp:10;",
 $1:function(a){return a.gXR()},
 $isEH:true},
-e173:{
-"^":"Tp:13;",
+e167:{
+"^":"Tp:10;",
 $1:function(a){return J.P5(a)},
 $isEH:true},
-e174:{
-"^":"Tp:13;",
+e168:{
+"^":"Tp:10;",
 $1:function(a){return a.gzS()},
 $isEH:true},
-e175:{
-"^":"Tp:13;",
+e169:{
+"^":"Tp:10;",
 $1:function(a){return J.iY(a)},
 $isEH:true},
-e176:{
-"^":"Tp:13;",
+e170:{
+"^":"Tp:10;",
 $1:function(a){return J.u9(a)},
 $isEH:true},
-e177:{
-"^":"Tp:13;",
+e171:{
+"^":"Tp:10;",
 $1:function(a){return J.U8(a)},
 $isEH:true},
-e178:{
-"^":"Tp:13;",
+e172:{
+"^":"Tp:10;",
 $1:function(a){return J.oN(a)},
 $isEH:true},
-e179:{
-"^":"Tp:13;",
+e173:{
+"^":"Tp:10;",
 $1:function(a){return a.gV8()},
 $isEH:true},
-e180:{
-"^":"Tp:13;",
+e174:{
+"^":"Tp:10;",
 $1:function(a){return a.gGD()},
 $isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
+e175:{
+"^":"Tp:10;",
+$1:function(a){return J.Td(a)},
 $isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
+e176:{
+"^":"Tp:10;",
 $1:function(a){return a.gDo()},
 $isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
+e177:{
+"^":"Tp:10;",
 $1:function(a){return J.j1(a)},
 $isEH:true},
-e186:{
-"^":"Tp:13;",
+e178:{
+"^":"Tp:10;",
 $1:function(a){return J.Aw(a)},
 $isEH:true},
-e187:{
-"^":"Tp:13;",
+e179:{
+"^":"Tp:10;",
 $1:function(a){return J.dY(a)},
 $isEH:true},
-e188:{
-"^":"Tp:13;",
+e180:{
+"^":"Tp:10;",
 $1:function(a){return J.OL(a)},
 $isEH:true},
-e189:{
-"^":"Tp:13;",
+e181:{
+"^":"Tp:10;",
 $1:function(a){return a.gki()},
 $isEH:true},
-e190:{
-"^":"Tp:13;",
+e182:{
+"^":"Tp:10;",
 $1:function(a){return a.gZn()},
 $isEH:true},
-e191:{
-"^":"Tp:13;",
+e183:{
+"^":"Tp:10;",
 $1:function(a){return a.gvs()},
 $isEH:true},
-e192:{
-"^":"Tp:13;",
+e184:{
+"^":"Tp:10;",
 $1:function(a){return a.gVh()},
 $isEH:true},
-e193:{
-"^":"Tp:13;",
+e185:{
+"^":"Tp:10;",
 $1:function(a){return a.gZX()},
 $isEH:true},
-e194:{
-"^":"Tp:13;",
+e186:{
+"^":"Tp:10;",
 $1:function(a){return J.SG(a)},
 $isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
+e187:{
+"^":"Tp:10;",
+$1:function(a){return J.eU(a)},
 $isEH:true},
-e196:{
-"^":"Tp:13;",
+e188:{
+"^":"Tp:10;",
 $1:function(a){return a.gVF()},
 $isEH:true},
-e197:{
-"^":"Tp:13;",
+e189:{
+"^":"Tp:10;",
 $1:function(a){return a.gkw()},
 $isEH:true},
-e198:{
-"^":"Tp:13;",
+e190:{
+"^":"Tp:10;",
 $1:function(a){return J.K2(a)},
 $isEH:true},
-e199:{
-"^":"Tp:13;",
+e191:{
+"^":"Tp:10;",
 $1:function(a){return J.uy(a)},
 $isEH:true},
-e200:{
-"^":"Tp:13;",
+e192:{
+"^":"Tp:10;",
 $1:function(a){return a.gEy()},
 $isEH:true},
-e201:{
-"^":"Tp:13;",
+e193:{
+"^":"Tp:10;",
 $1:function(a){return J.Kd(a)},
 $isEH:true},
-e202:{
-"^":"Tp:13;",
+e194:{
+"^":"Tp:10;",
 $1:function(a){return J.Sl(a)},
 $isEH:true},
-e203:{
-"^":"Tp:13;",
+e195:{
+"^":"Tp:10;",
 $1:function(a){return a.gJk()},
 $isEH:true},
-e204:{
-"^":"Tp:13;",
+e196:{
+"^":"Tp:10;",
 $1:function(a){return J.Nl(a)},
 $isEH:true},
-e205:{
-"^":"Tp:13;",
+e197:{
+"^":"Tp:10;",
 $1:function(a){return a.gFc()},
 $isEH:true},
-e206:{
-"^":"Tp:13;",
+e198:{
+"^":"Tp:10;",
 $1:function(a){return a.gYY()},
 $isEH:true},
-e207:{
-"^":"Tp:13;",
+e199:{
+"^":"Tp:10;",
 $1:function(a){return a.gZ3()},
 $isEH:true},
-e208:{
-"^":"Tp:13;",
+e200:{
+"^":"Tp:10;",
 $1:function(a){return a.gYe()},
 $isEH:true},
-e209:{
-"^":"Tp:13;",
+e201:{
+"^":"Tp:10;",
 $1:function(a){return J.I2(a)},
 $isEH:true},
-e210:{
-"^":"Tp:13;",
+e202:{
+"^":"Tp:10;",
 $1:function(a){return a.gzz()},
 $isEH:true},
-e211:{
-"^":"Tp:13;",
+e203:{
+"^":"Tp:10;",
 $1:function(a){return J.tp(a)},
 $isEH:true},
-e212:{
-"^":"Tp:13;",
+e204:{
+"^":"Tp:10;",
 $1:function(a){return a.gaU()},
 $isEH:true},
-e213:{
-"^":"Tp:75;",
+e205:{
+"^":"Tp:69;",
 $2:function(a,b){J.RX(a,b)},
 $isEH:true},
-e214:{
-"^":"Tp:75;",
+e206:{
+"^":"Tp:69;",
 $2:function(a,b){J.a8(a,b)},
 $isEH:true},
-e215:{
-"^":"Tp:75;",
+e207:{
+"^":"Tp:69;",
+$2:function(a,b){J.oO(a,b)},
+$isEH:true},
+e208:{
+"^":"Tp:69;",
 $2:function(a,b){J.l7(a,b)},
 $isEH:true},
-e216:{
-"^":"Tp:75;",
+e209:{
+"^":"Tp:69;",
 $2:function(a,b){J.kB(a,b)},
 $isEH:true},
-e217:{
-"^":"Tp:75;",
+e210:{
+"^":"Tp:69;",
 $2:function(a,b){J.Ae(a,b)},
 $isEH:true},
-e218:{
-"^":"Tp:75;",
+e211:{
+"^":"Tp:69;",
 $2:function(a,b){J.IX(a,b)},
 $isEH:true},
-e219:{
-"^":"Tp:75;",
+e212:{
+"^":"Tp:69;",
 $2:function(a,b){J.WI(a,b)},
 $isEH:true},
-e220:{
-"^":"Tp:75;",
+e213:{
+"^":"Tp:69;",
 $2:function(a,b){J.o0(a,b)},
 $isEH:true},
-e221:{
-"^":"Tp:75;",
-$2:function(a,b){J.T5(a,b)},
+e214:{
+"^":"Tp:69;",
+$2:function(a,b){J.fH(a,b)},
 $isEH:true},
-e222:{
-"^":"Tp:75;",
+e215:{
+"^":"Tp:69;",
 $2:function(a,b){J.Sf(a,b)},
 $isEH:true},
-e223:{
-"^":"Tp:75;",
+e216:{
+"^":"Tp:69;",
 $2:function(a,b){J.qA(a,b)},
 $isEH:true},
-e224:{
-"^":"Tp:75;",
+e217:{
+"^":"Tp:69;",
 $2:function(a,b){J.LM(a,b)},
 $isEH:true},
-e225:{
-"^":"Tp:75;",
+e218:{
+"^":"Tp:69;",
 $2:function(a,b){J.qq(a,b)},
 $isEH:true},
-e226:{
-"^":"Tp:75;",
+e219:{
+"^":"Tp:69;",
 $2:function(a,b){J.Pk(a,b)},
 $isEH:true},
-e227:{
-"^":"Tp:75;",
+e220:{
+"^":"Tp:69;",
 $2:function(a,b){J.Yz(a,b)},
 $isEH:true},
-e228:{
-"^":"Tp:75;",
+e221:{
+"^":"Tp:69;",
 $2:function(a,b){a.sw2(b)},
 $isEH:true},
-e229:{
-"^":"Tp:75;",
+e222:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qr(a,b)},
 $isEH:true},
-e230:{
-"^":"Tp:75;",
+e223:{
+"^":"Tp:69;",
 $2:function(a,b){J.xW(a,b)},
 $isEH:true},
-e231:{
-"^":"Tp:75;",
+e224:{
+"^":"Tp:69;",
 $2:function(a,b){J.BC(a,b)},
 $isEH:true},
-e232:{
-"^":"Tp:75;",
+e225:{
+"^":"Tp:69;",
 $2:function(a,b){J.VJ(a,b)},
 $isEH:true},
-e233:{
-"^":"Tp:75;",
+e226:{
+"^":"Tp:69;",
 $2:function(a,b){J.NO(a,b)},
 $isEH:true},
-e234:{
-"^":"Tp:75;",
+e227:{
+"^":"Tp:69;",
 $2:function(a,b){J.WB(a,b)},
 $isEH:true},
-e235:{
-"^":"Tp:75;",
+e228:{
+"^":"Tp:69;",
 $2:function(a,b){J.JZ(a,b)},
 $isEH:true},
-e236:{
-"^":"Tp:75;",
+e229:{
+"^":"Tp:69;",
 $2:function(a,b){J.fR(a,b)},
 $isEH:true},
-e237:{
-"^":"Tp:75;",
+e230:{
+"^":"Tp:69;",
 $2:function(a,b){a.shY(b)},
 $isEH:true},
-e238:{
-"^":"Tp:75;",
+e231:{
+"^":"Tp:69;",
 $2:function(a,b){J.LP(a,b)},
 $isEH:true},
-e239:{
-"^":"Tp:75;",
+e232:{
+"^":"Tp:69;",
 $2:function(a,b){J.GF(a,b)},
 $isEH:true},
-e240:{
-"^":"Tp:75;",
+e233:{
+"^":"Tp:69;",
 $2:function(a,b){J.Nf(a,b)},
 $isEH:true},
-e241:{
-"^":"Tp:75;",
+e234:{
+"^":"Tp:69;",
 $2:function(a,b){J.Pl(a,b)},
 $isEH:true},
-e242:{
-"^":"Tp:75;",
+e235:{
+"^":"Tp:69;",
 $2:function(a,b){J.C3(a,b)},
 $isEH:true},
-e243:{
-"^":"Tp:75;",
+e236:{
+"^":"Tp:69;",
 $2:function(a,b){J.xH(a,b)},
 $isEH:true},
-e244:{
-"^":"Tp:75;",
+e237:{
+"^":"Tp:69;",
 $2:function(a,b){J.Nh(a,b)},
 $isEH:true},
-e245:{
-"^":"Tp:75;",
+e238:{
+"^":"Tp:69;",
+$2:function(a,b){a.sHP(b)},
+$isEH:true},
+e239:{
+"^":"Tp:69;",
 $2:function(a,b){J.AI(a,b)},
 $isEH:true},
-e246:{
-"^":"Tp:75;",
+e240:{
+"^":"Tp:69;",
 $2:function(a,b){J.nA(a,b)},
 $isEH:true},
-e247:{
-"^":"Tp:75;",
+e241:{
+"^":"Tp:69;",
 $2:function(a,b){J.fb(a,b)},
 $isEH:true},
-e248:{
-"^":"Tp:75;",
+e242:{
+"^":"Tp:69;",
 $2:function(a,b){J.tv(a,b)},
 $isEH:true},
-e249:{
-"^":"Tp:75;",
+e243:{
+"^":"Tp:69;",
 $2:function(a,b){a.siq(b)},
 $isEH:true},
-e250:{
-"^":"Tp:75;",
+e244:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qy(a,b)},
 $isEH:true},
-e251:{
-"^":"Tp:75;",
+e245:{
+"^":"Tp:69;",
 $2:function(a,b){a.sKt(b)},
 $isEH:true},
-e252:{
-"^":"Tp:75;",
+e246:{
+"^":"Tp:69;",
 $2:function(a,b){J.Oo(a,b)},
 $isEH:true},
-e253:{
-"^":"Tp:75;",
+e247:{
+"^":"Tp:69;",
 $2:function(a,b){J.mU(a,b)},
 $isEH:true},
-e254:{
-"^":"Tp:75;",
+e248:{
+"^":"Tp:69;",
 $2:function(a,b){J.Kz(a,b)},
 $isEH:true},
-e255:{
-"^":"Tp:75;",
+e249:{
+"^":"Tp:69;",
 $2:function(a,b){J.uM(a,b)},
 $isEH:true},
-e256:{
-"^":"Tp:75;",
+e250:{
+"^":"Tp:69;",
 $2:function(a,b){J.Er(a,b)},
 $isEH:true},
-e257:{
-"^":"Tp:75;",
+e251:{
+"^":"Tp:69;",
 $2:function(a,b){J.uX(a,b)},
 $isEH:true},
-e258:{
-"^":"Tp:75;",
+e252:{
+"^":"Tp:69;",
 $2:function(a,b){J.hS(a,b)},
 $isEH:true},
-e259:{
-"^":"Tp:75;",
+e253:{
+"^":"Tp:69;",
 $2:function(a,b){a.sSK(b)},
 $isEH:true},
-e260:{
-"^":"Tp:75;",
+e254:{
+"^":"Tp:69;",
 $2:function(a,b){a.shX(b)},
 $isEH:true},
-e261:{
-"^":"Tp:75;",
+e255:{
+"^":"Tp:69;",
 $2:function(a,b){J.cl(a,b)},
 $isEH:true},
-e262:{
-"^":"Tp:75;",
+e256:{
+"^":"Tp:69;",
 $2:function(a,b){J.Jb(a,b)},
 $isEH:true},
-e263:{
-"^":"Tp:75;",
+e257:{
+"^":"Tp:69;",
 $2:function(a,b){J.k7(a,b)},
 $isEH:true},
-e264:{
-"^":"Tp:75;",
+e258:{
+"^":"Tp:69;",
 $2:function(a,b){J.MX(a,b)},
 $isEH:true},
-e265:{
-"^":"Tp:75;",
+e259:{
+"^":"Tp:69;",
 $2:function(a,b){J.A4(a,b)},
 $isEH:true},
-e266:{
-"^":"Tp:75;",
+e260:{
+"^":"Tp:69;",
 $2:function(a,b){J.wD(a,b)},
 $isEH:true},
-e267:{
-"^":"Tp:75;",
+e261:{
+"^":"Tp:69;",
 $2:function(a,b){J.wJ(a,b)},
 $isEH:true},
-e268:{
-"^":"Tp:75;",
+e262:{
+"^":"Tp:69;",
 $2:function(a,b){J.oJ(a,b)},
 $isEH:true},
-e269:{
-"^":"Tp:75;",
+e263:{
+"^":"Tp:69;",
 $2:function(a,b){J.DF(a,b)},
 $isEH:true},
-e270:{
-"^":"Tp:75;",
+e264:{
+"^":"Tp:69;",
 $2:function(a,b){J.Mi(a,b)},
 $isEH:true},
-e271:{
-"^":"Tp:75;",
+e265:{
+"^":"Tp:69;",
 $2:function(a,b){a.sL1(b)},
 $isEH:true},
-e272:{
-"^":"Tp:75;",
+e266:{
+"^":"Tp:69;",
 $2:function(a,b){J.XF(a,b)},
 $isEH:true},
-e273:{
-"^":"Tp:75;",
+e267:{
+"^":"Tp:69;",
 $2:function(a,b){J.SF(a,b)},
 $isEH:true},
-e274:{
-"^":"Tp:75;",
+e268:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qv(a,b)},
 $isEH:true},
-e275:{
-"^":"Tp:75;",
+e269:{
+"^":"Tp:69;",
 $2:function(a,b){J.Xg(a,b)},
 $isEH:true},
-e276:{
-"^":"Tp:75;",
+e270:{
+"^":"Tp:69;",
 $2:function(a,b){J.aw(a,b)},
 $isEH:true},
-e277:{
-"^":"Tp:75;",
+e271:{
+"^":"Tp:69;",
 $2:function(a,b){J.CJ(a,b)},
 $isEH:true},
-e278:{
-"^":"Tp:75;",
+e272:{
+"^":"Tp:69;",
 $2:function(a,b){J.P2(a,b)},
 $isEH:true},
-e279:{
-"^":"Tp:75;",
+e273:{
+"^":"Tp:69;",
 $2:function(a,b){J.fv(a,b)},
 $isEH:true},
-e280:{
-"^":"Tp:75;",
+e274:{
+"^":"Tp:69;",
 $2:function(a,b){J.PP(a,b)},
 $isEH:true},
-e281:{
-"^":"Tp:75;",
+e275:{
+"^":"Tp:69;",
 $2:function(a,b){J.Sj(a,b)},
 $isEH:true},
-e282:{
-"^":"Tp:75;",
+e276:{
+"^":"Tp:69;",
 $2:function(a,b){J.AJ(a,b)},
 $isEH:true},
-e283:{
-"^":"Tp:75;",
+e277:{
+"^":"Tp:69;",
 $2:function(a,b){J.w7(a,b)},
 $isEH:true},
-e284:{
-"^":"Tp:75;",
+e278:{
+"^":"Tp:69;",
 $2:function(a,b){J.ME(a,b)},
 $isEH:true},
-e285:{
-"^":"Tp:75;",
+e279:{
+"^":"Tp:69;",
 $2:function(a,b){J.kX(a,b)},
 $isEH:true},
-e286:{
-"^":"Tp:75;",
+e280:{
+"^":"Tp:69;",
+$2:function(a,b){J.S5(a,b)},
+$isEH:true},
+e281:{
+"^":"Tp:69;",
 $2:function(a,b){J.q0(a,b)},
 $isEH:true},
-e287:{
-"^":"Tp:75;",
+e282:{
+"^":"Tp:69;",
 $2:function(a,b){J.EJ(a,b)},
 $isEH:true},
-e288:{
-"^":"Tp:75;",
+e283:{
+"^":"Tp:69;",
 $2:function(a,b){J.iH(a,b)},
 $isEH:true},
-e289:{
-"^":"Tp:75;",
+e284:{
+"^":"Tp:69;",
 $2:function(a,b){J.B9(a,b)},
 $isEH:true},
-e290:{
-"^":"Tp:75;",
+e285:{
+"^":"Tp:69;",
 $2:function(a,b){J.PN(a,b)},
 $isEH:true},
-e291:{
-"^":"Tp:75;",
+e286:{
+"^":"Tp:69;",
 $2:function(a,b){a.sVc(b)},
 $isEH:true},
-e292:{
-"^":"Tp:75;",
+e287:{
+"^":"Tp:69;",
 $2:function(a,b){J.By(a,b)},
 $isEH:true},
-e293:{
-"^":"Tp:75;",
+e288:{
+"^":"Tp:69;",
 $2:function(a,b){J.jd(a,b)},
 $isEH:true},
-e294:{
-"^":"Tp:75;",
+e289:{
+"^":"Tp:69;",
 $2:function(a,b){J.Rx(a,b)},
 $isEH:true},
-e295:{
-"^":"Tp:75;",
+e290:{
+"^":"Tp:69;",
 $2:function(a,b){J.ZI(a,b)},
 $isEH:true},
-e296:{
-"^":"Tp:75;",
+e291:{
+"^":"Tp:69;",
 $2:function(a,b){J.wg(a,b)},
 $isEH:true},
-e297:{
-"^":"Tp:75;",
+e292:{
+"^":"Tp:69;",
 $2:function(a,b){J.fa(a,b)},
 $isEH:true},
-e298:{
-"^":"Tp:75;",
+e293:{
+"^":"Tp:69;",
 $2:function(a,b){J.Cu(a,b)},
 $isEH:true},
-e299:{
-"^":"Tp:75;",
+e294:{
+"^":"Tp:69;",
 $2:function(a,b){a.sV8(b)},
 $isEH:true},
-e300:{
-"^":"Tp:75;",
+e295:{
+"^":"Tp:69;",
 $2:function(a,b){J.Tx(a,b)},
 $isEH:true},
-e301:{
-"^":"Tp:75;",
+e296:{
+"^":"Tp:69;",
 $2:function(a,b){a.sDo(b)},
 $isEH:true},
-e302:{
-"^":"Tp:75;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e303:{
-"^":"Tp:75;",
+e297:{
+"^":"Tp:69;",
 $2:function(a,b){J.H3(a,b)},
 $isEH:true},
-e304:{
-"^":"Tp:75;",
+e298:{
+"^":"Tp:69;",
 $2:function(a,b){J.t3(a,b)},
 $isEH:true},
-e305:{
-"^":"Tp:75;",
+e299:{
+"^":"Tp:69;",
 $2:function(a,b){J.GT(a,b)},
 $isEH:true},
-e306:{
-"^":"Tp:75;",
+e300:{
+"^":"Tp:69;",
 $2:function(a,b){a.sVF(b)},
 $isEH:true},
-e307:{
-"^":"Tp:75;",
+e301:{
+"^":"Tp:69;",
 $2:function(a,b){J.yO(a,b)},
 $isEH:true},
-e308:{
-"^":"Tp:75;",
+e302:{
+"^":"Tp:69;",
 $2:function(a,b){J.ZU(a,b)},
 $isEH:true},
-e309:{
-"^":"Tp:75;",
-$2:function(a,b){J.rY(a,b)},
+e303:{
+"^":"Tp:69;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
-e310:{
-"^":"Tp:75;",
+e304:{
+"^":"Tp:69;",
 $2:function(a,b){J.tH(a,b)},
 $isEH:true},
-e311:{
-"^":"Tp:69;",
+e305:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e312:{
-"^":"Tp:69;",
+e306:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e313:{
-"^":"Tp:69;",
+e307:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e314:{
-"^":"Tp:69;",
+e308:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e315:{
-"^":"Tp:69;",
+e309:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e316:{
-"^":"Tp:69;",
+e310:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e317:{
-"^":"Tp:69;",
+e311:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e318:{
-"^":"Tp:69;",
+e312:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e319:{
-"^":"Tp:69;",
+e313:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
+e314:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e322:{
-"^":"Tp:69;",
+e315:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e323:{
-"^":"Tp:69;",
+e316:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e324:{
-"^":"Tp:69;",
+e317:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e325:{
-"^":"Tp:69;",
+e318:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e326:{
-"^":"Tp:69;",
+e319:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
+e320:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e329:{
-"^":"Tp:69;",
+e321:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e330:{
-"^":"Tp:69;",
+e322:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e331:{
-"^":"Tp:69;",
+e323:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e332:{
-"^":"Tp:69;",
+e324:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e333:{
-"^":"Tp:69;",
+e325:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e334:{
-"^":"Tp:69;",
+e326:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e335:{
-"^":"Tp:69;",
+e327:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e336:{
-"^":"Tp:69;",
+e328:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e337:{
-"^":"Tp:69;",
+e329:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e338:{
-"^":"Tp:69;",
+e330:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e339:{
-"^":"Tp:69;",
+e331:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e340:{
-"^":"Tp:69;",
+e332:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e341:{
-"^":"Tp:69;",
+e333:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e342:{
-"^":"Tp:69;",
+e334:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e343:{
-"^":"Tp:69;",
+e335:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e344:{
-"^":"Tp:69;",
+e336:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e345:{
-"^":"Tp:69;",
+e337:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e346:{
-"^":"Tp:69;",
+e338:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e347:{
-"^":"Tp:69;",
+e339:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e348:{
-"^":"Tp:69;",
+e340:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e349:{
-"^":"Tp:69;",
+e341:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e350:{
-"^":"Tp:69;",
+e342:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e351:{
-"^":"Tp:69;",
+e343:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e352:{
-"^":"Tp:69;",
+e344:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e353:{
-"^":"Tp:69;",
+e345:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e354:{
-"^":"Tp:69;",
+e346:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e355:{
-"^":"Tp:69;",
+e347:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e356:{
-"^":"Tp:69;",
+e348:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e357:{
-"^":"Tp:69;",
+e349:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e358:{
-"^":"Tp:69;",
+e350:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e359:{
-"^":"Tp:69;",
+e351:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e360:{
-"^":"Tp:69;",
+e352:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e361:{
-"^":"Tp:69;",
+e353:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e362:{
-"^":"Tp:69;",
+e354:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e363:{
-"^":"Tp:69;",
+e355:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e364:{
-"^":"Tp:69;",
+e356:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e365:{
-"^":"Tp:69;",
+e357:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e366:{
-"^":"Tp:69;",
+e358:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e367:{
-"^":"Tp:69;",
+e359:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e368:{
-"^":"Tp:69;",
+e360:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-counter-chart",C.z7)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e369:{
-"^":"Tp:69;",
+e361:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+e362:{
+"^":"Tp:66;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e371:{
-"^":"Tp:69;",
+e363:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e372:{
-"^":"Tp:69;",
+e364:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e373:{
-"^":"Tp:69;",
+e365:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e374:{
-"^":"Tp:69;",
+e366:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e375:{
-"^":"Tp:69;",
+e367:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e376:{
-"^":"Tp:69;",
+e368:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e377:{
-"^":"Tp:69;",
+e369:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e378:{
-"^":"Tp:69;",
+e370:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e379:{
-"^":"Tp:69;",
+e371:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e380:{
-"^":"Tp:69;",
+e372:{
+"^":"Tp:66;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e373:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e381:{
-"^":"Tp:69;",
+e374:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e382:{
-"^":"Tp:69;",
+e375:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e383:{
-"^":"Tp:69;",
+e376:{
+"^":"Tp:66;",
 $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,{
 "^":"",
@@ -4074,8 +3916,8 @@
 "^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,20,91],
-static:{Dw:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,17,84],
+static:{KU:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -4084,8 +3926,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.C8.ZL(a)
-C.C8.XI(a)
+C.J0.ZL(a)
+C.J0.XI(a)
 return a}}},
 Vf:{
 "^":"uL+Pi;",
@@ -4105,93 +3947,16 @@
 a.LL=w
 C.YZz.ZL(a)
 C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-TY:{
-"^":"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.TY(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,a6,nh,q9,YE,JB,on,BA,LL",
-god:function(a){return a.CA},
-sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
-q0:function(a){var z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-z=a.CA
-if(z!=null)this.hP(a,z.gDZ())},
-Wt:[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.TY(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.TY(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.WT),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,92,88],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,92,88],
-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,x,w
-z=$.XZ()
-y=P.YM(null,null,null,P.qU,W.I0)
-x=P.qU
-w=W.h4
-w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.on=z
-a.BA=y
-a.LL=w
-C.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,{
+return a}}}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 aC:{
-"^":"Dsd;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Vfx;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,97,99],
-RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,20,91],
-static:{lW:function(a){var z,y,x,w
+vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,85,86],
+S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,85,87],
+RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,17,84],
+static:{zg:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -4203,7 +3968,7 @@
 C.ka.ZL(a)
 C.ka.XI(a)
 return a}}},
-Dsd:{
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
@@ -4211,7 +3976,7 @@
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,54],
 static:{On:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4227,7 +3992,7 @@
 return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Dsd;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 q0:function(a){var z
@@ -4235,7 +4000,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.aa())},
-RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,17,84],
 m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4245,10 +4010,10 @@
 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,100,1,94,95],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,88,1,89,90],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,100,1,94,95],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,88,1,89,90],
 static:{f9:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4261,16 +4026,16 @@
 C.ux.ZL(a)
 C.ux.XI(a)
 return a}}},
-tuj:{
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
 aa:{
-"^":"Tp:101;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,80,"call"],
+"^":"Tp:91;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,74,"call"],
 $isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":"Vct;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"tuj;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gDX:function(a){return a.Xf},
 sDX:function(a,b){a.Xf=this.ct(a,C.Ms,a.Xf,b)},
 gvu:function(a){return a.VA},
@@ -4296,7 +4061,7 @@
 C.T0.ZL(a)
 C.T0.XI(a)
 return a}}},
-Vct:{
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
@@ -4313,15 +4078,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 na:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,20,57],
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,54],
 Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,15],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,79,46,47,80],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,73,43,44,74],
 static:{U9:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4339,12 +4104,12 @@
 C.O0.XI(a)
 return a}}},
 Xfs:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+qo:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
@@ -4383,7 +4148,7 @@
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.ew(b,1)
 C.Nm.u(a,b,v)}},
-Lm:function(a,b,c){var z,y
+aB:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
@@ -4405,7 +4170,7 @@
 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)},
+else H.d4(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
@@ -4413,7 +4178,7 @@
 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
+d4: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
@@ -4548,7 +4313,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},28],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4564,7 +4329,7 @@
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
 $isyN:true},
-bX:{
+nH:{
 "^":"aL;l6,SH,AN",
 gMa:function(){var z,y
 z=J.q8(this.l6)
@@ -4603,7 +4368,7 @@
 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:{j5:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
+static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -4687,7 +4452,7 @@
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-h5:{
+Lj:{
 "^":"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"))},
@@ -4732,16 +4497,16 @@
 x=y.gB(z)
 if(typeof b!=="number")return H.s(b)
 return y.Zv(z,x-1-b)}},
-IN:{
+GD:{
 "^":"a;fN<",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
+return!!J.x(b).$isGD&&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,
+$isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,q3,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
 kU:function(a){var z=H.VM(function(b,c){var y=[]
@@ -4752,55 +4517,36 @@
 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],
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,16],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,16],
 VH:function(a,b){var z=H.G3()
-z=H.fH(z,[z,z]).BD(a)
+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.cH(C.ny,new P.w4(a,z))
+P.ww(C.ny,new P.w4(a,z))
 return z},
-hz: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.PG(C.xD,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())
+$.ej().$1(P.rh())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
+throw z}},"$0","rh",0,0,15],
 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)
+$.ej().$1(P.rh())}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
@@ -4815,22 +4561,20 @@
 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],
+SN:[function(a){},"$1","Ax",2,0,17,18],
+vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,19,20,21,22],
+p0:[function(){},"$0","od",0,0,15],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
-else b.K5(c,d)},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.wM(new P.Q0(b,c))
-else b.rX(c)},
-cH:function(a,b){var z
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
+ww:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
@@ -4839,35 +4583,35 @@
 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],
+CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,23,24,25,26,21,22],
 T8:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
-yv:[function(a,b,c,d,e){var z,y
+return y}finally{$.X3=z}},"$4","lw",8,0,27,24,25,26,28],
+V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","Un",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,29,24,25,26,28,30],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$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],
+return y}finally{$.X3=z}},"$6","iy",12,0,31,24,25,26,28,6,7],
+Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,32,24,25,26,28],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,33,24,25,26,28],
+dL:[function(a,b,c,d){return d},"$4","v3",8,0,34,24,25,26,28],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,35],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,36,24,25,26,37,38],
+XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,39],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,40],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.jt()
 z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Is",10,0,44],
+return new P.uo(c,d,z)},"$5","Is",10,0,41],
 C6:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4877,7 +4621,7 @@
 Ik:{
 "^":"O9;Y8"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
+"^":"Bx;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4894,10 +4638,10 @@
 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],
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 static:{"^":"E2b,H6,id"}},
-Ks:{
+WV:{
 "^":"a;iE@,SJ@",
 gUF:function(){return!1},
 im:function(){var z=this.yx
@@ -4912,36 +4656,16 @@
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.to($.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.IG(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},102],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},92],
 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,103,23,24,25],
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,93,20,21,22],
 S6:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -4956,7 +4680,7 @@
 this.WX=null
 this.Gv&=4294967287
 C.jN.tZ(z)},
-Qz:function(a){var z,y,x,w
+nE: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
@@ -4979,17 +4703,17 @@
 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",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
 this.iE.Rg(a)
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
-return}this.Qz(new P.tK(this,a))},
+return}this.nE(new P.tK(this,a))},
 pb:function(a,b){if(this.iE===this)return
-this.Qz(new P.OR(this,a,b))},
-Pl:function(){if(this.iE!==this)this.Qz(new P.eB(this))
+this.nE(new P.OR(this,a,b))},
+Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
 else this.yx.OH(null)}},
 tK:{
 "^":"Tp;a,b",
@@ -5007,51 +4731,27 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.LR,a]]}},this.a,"zW")}},
 HX:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},
+z.VI(y)}},
 pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
+for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
 Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.ZB)
 else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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:75;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,104,105,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:106;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},
@@ -5062,12 +4762,12 @@
 "^":"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,107,23,21],
-w0:[function(a,b){var z
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,94,20,18],
+w0:function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gXN",2,2,103,23,24,25]},
+z.CG(a,b)}},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -5124,7 +4824,7 @@
 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],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,19,20,21,22],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -5137,11 +4837,11 @@
 CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.In(this,a,b))},
-J9:function(a,b){this.OH(a)},
 X8:function(a,b,c){this.CG(a,b)},
+J9:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
+static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
@@ -5193,31 +4893,31 @@
 y=b
 b=q}}}},
 da:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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"],
+"^":"Tp:10;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,18,"call"],
 $isEH:true},
 vr:{
-"^":"Tp:108;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"],
+"^":"Tp:95;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Tp:69;c,d",
+"^":"Tp:66;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 In:{
-"^":"Tp:69;a,b,c",
+"^":"Tp:66;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:109;b,d,e,f",
+"^":"Tp:96;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)
@@ -5227,7 +4927,7 @@
 return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:18;c,b,UI,bK",
+"^":"Tp:15;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
@@ -5245,7 +4945,7 @@
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
 p=H.G3()
-p=H.fH(p,[p,p]).BD(r)
+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())
@@ -5263,7 +4963,7 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
+"^":"Tp:15;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -5283,24 +4983,24 @@
 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,110,"call"],
+"^":"Tp:10;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:108;a,mG",
+"^":"Tp:95;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},111],
-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.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},111],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},98],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},98],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5331,7 +5031,7 @@
 z.a=null
 z.a=this.KR(new P.qg(z,y),!0,new P.yB(y),y.gaq())
 return y},
-gtH:function(a){var z,y
+geK:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"cb",0))
 z.a=null
@@ -5350,36 +5050,36 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,112,"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 BE:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 Oh:{
-"^":"Tp:113;a,UI",
+"^":"Tp:100;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 kb:{
-"^":"Tp:69;bK",
+"^":"Tp:66;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,112,"call"],
+$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,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 at:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 mj:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){},
 $isEH:true},
 ib:{
-"^":"Tp:69;UI",
+"^":"Tp:66;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ia:{
@@ -5387,55 +5087,55 @@
 $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,112,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 WN:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Tp:113;a,UI",
+"^":"Tp:100;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 BSd:{
-"^":"Tp:69;bK",
+"^":"Tp:66;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uO:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 hh:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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"],
+"^":"Tp:10;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 yB:{
-"^":"Tp:69;c",
+"^":"Tp:66;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 xp:{
-"^":"Tp:69;d",
+"^":"Tp:66;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"],
+z.a=a},"$1",null,2,0,null,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Tp:69;a,c",
+"^":"Tp:66;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"],
@@ -5443,177 +5143,89 @@
 MO:{
 "^":"a;",
 $isMO:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gWS().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()},
-gWS: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.IG(function(a){return{func:"XJ",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){var z=this.Gv
-if((z&1)!==0)this.Iv(a)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(a,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.zl(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.wM(this.gYm())
-v=new P.Bc(this)
-if(z!=null)z=z.wM(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.zl(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"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.gWS().Rg(a)},
-pb:function(a,b){this.gWS().oJ(a,b)},
-Pl:function(){this.gWS().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gWS().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gWS().w6(new P.WG(a,b,null))},
-Pl:function(){this.gWS().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)},
+"^":"ez;",
+w4:function(a){var z,y,x,w
+z=this.Y8
+if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
+y=$.X3
+x=a?1:0
+w=H.VM(new P.LR(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w.SJ=w
+w.iE=w
+x=z.SJ
+w.SJ=x
+w.iE=z
+x.siE(w)
+z.SJ=w
+w.Ae=z.Gv&1
+if(z.iE===w)P.ot(z.nL)
+return w},
 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,nb",
+Bx:{
+"^":"KA;Y8<",
 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]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,15],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,15]},
 NOT:{
 "^":"a;"},
 KA:{
 "^":"a;pN,o7<,Bd,Lj<,Gv,lz,nb",
-WN:function(a){if(a==null)return
-this.nb=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.nb.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
+Fv:[function(a,b){var z,y
+z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.nb!=null)this.nb.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,114,23,115],
+if(z<128&&this.nb!=null){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,101,20,102],
 zl:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
-if(z<128){if((z&64)!==0){z=this.nb
-z=!z.gl0(z)}else z=!1
-if(z)this.nb.t2(this)
-else{z=(this.Gv&4294967291)>>>0
+if(z<128)if((z&64)!==0&&this.nb.N6!=null)this.nb.t2(this)
+else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
+if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,15],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
 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
+tk:function(){var z,y
+z=(this.Gv|8)>>>0
 this.Gv=z
-if((z&64)!==0)this.nb.FK()
-if((this.Gv&32)===0)this.nb=null
+if((z&64)!==0){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&32)===0)this.nb=null
 this.lz=this.tA()},
 Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(a)
-else this.w6(H.VM(new P.fZ(a,null),[null]))},
+else this.VI(H.VM(new P.fZ(a,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))},
+else this.VI(new P.WG(a,b,null))},
 YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.Pl()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+else this.VI(C.ZB)},
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 tA:function(){},
-w6:function(a){var z,y
+VI:function(a){var z,y
 z=this.nb
 if(z==null){z=new P.qm(null,null,0)
 this.nb=z}z.h(0,a)
@@ -5631,44 +5243,37 @@
 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.wM(y)
-else y.$0()}else{y.$0()
+y.$0()}else{y.$0()
 this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
+Pl:function(){this.tk()
 this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.wM(z)
-else z.$0()},
+new P.qQ(this).$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.nb
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
+Kl:function(a){var z,y,x
+z=this.Gv
+if((z&64)!==0&&this.nb.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
-if((z&4)!==0)if(z<128){z=this.nb
-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.nb=null
-return}y=(z&4)!==0
-if(a===y)break
+if((z&4)!==0)if(z<128){y=this.nb
+y=y==null||y.N6==null}else y=!1
+else y=!1
+if(y){z=(z&4294967291)>>>0
+this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.nb=null
+return}x=(z&4)!==0
+if(a===x)break
 this.Gv=(z^32)>>>0
-if(y)this.uO()
+if(x)this.uO()
 else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.nb.t2(this)},
+z=(this.Gv&4294967263)>>>0
+this.Gv=z}if((z&64)!==0&&z<128)this.nb.t2(this)},
 $isMO:true,
 static:{"^":"Xx,bG,nS,Ir,nav,Dr,JAK,N3S,bsZ"}},
 x1:{
-"^":"Tp:18;a,b,c",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:15;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -5677,21 +5282,21 @@
 if(!y.fC($.X3))$.X3.hk(this.b,this.c)
 else{x=z.o7
 w=H.G3()
-w=H.fH(w,[w,w]).BD(x)
+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"],
+else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
+"^":"Tp:15;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"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 ez:{
 "^":"cb;",
@@ -5727,10 +5332,9 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.Vd(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
+this.Gv=1}},
 Vd:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5754,41 +5358,17 @@
 V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null}},
-to:{
-"^":"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.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,114,23,115],
-zl:[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],
-$isMO:true,
-static:{"^":"FkV,ED7,kf"}},
 dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:66;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:116;a,b",
+"^":"Tp:103;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"],
+"^":"Tp:66;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
 og:{
 "^":"cb;",
@@ -5816,16 +5396,16 @@
 P.KA.prototype.oJ.call(this,a,b)},
 uO:[function(){var z=this.WS
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
+z.yy(0)},"$0","gp4",0,0,15],
 LP:[function(){var z=this.WS
 if(z==null)return
-z.zl(0)},"$0","gZ9",0,0,18],
+z.zl(0)},"$0","gZ9",0,0,15],
 tA:function(){var z=this.WS
 if(z!=null){this.WS=null
 z.ed()}return},
-vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},102],
-xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,117,24,25],
-fE:[function(){this.YB()},"$0","gH1",0,0,18],
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},92],
+xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,104,21,22],
+fE:[function(){this.YB()},"$0","gH1",0,0,15],
 Ri:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5868,7 +5448,7 @@
 aY:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,il<",
+"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,il<",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
 FI:function(a,b){return this.Ot.$2(a,b)},
@@ -5879,7 +5459,7 @@
 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)},
+Ch:function(a,b){return this.mp.$1(b)},
 qp:function(a){return this.il.$1$specification(a)}},
 qK:{
 "^":"a;"},
@@ -5919,15 +5499,15 @@
 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)
+for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
 y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
+y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
 ld:function(a,b,c){var z,y
 z=this.nU
 for(;z.gtp().gil()==null;)z=z.geT(z)
 y=z.geT(z)
 return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+ld:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
 bH:function(a){var z,y,x,w
@@ -5956,23 +5536,23 @@
 if(b)return new P.Cg(this,z)
 else return new P.Hs(this,z)}},
 TF:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Xz:{
-"^":"Tp:69;c,d",
+"^":"Tp:66;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"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,30,"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"],
+"^":"Tp:10;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
 uo:{
-"^":"fZi;eT>,tp<,Se",
+"^":"ld;eT>,tp<,Se",
 gC5:function(){return this.eT.gC5()},
 t:function(a,b){var z,y
 z=this.Se
@@ -5992,11 +5572,11 @@
 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",
+"^":"Tp:66;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",
+"^":"Tp:66;c,d",
 $0:[function(){var z,y
 z=this.c
 P.FL("Uncaught Error: "+H.d(z))
@@ -6006,8 +5586,8 @@
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:69;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,70,18,"call"],
 $isEH:true},
 AH:{
 "^":"a;",
@@ -6015,7 +5595,7 @@
 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()},
+gOt:function(){return P.MM()},
 FI:function(a,b){return this.gOt().$2(a,b)},
 geo:function(){return P.iy()},
 mg:function(a,b,c){return this.geo().$3(a,b,c)},
@@ -6030,14 +5610,14 @@
 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)},
+gmp:function(a){return P.aW()},
+Ch:function(a,b){return this.gmp(this).$1(b)},
 gil:function(){return P.Is()},
 qp:function(a){return this.gil().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"ld;",
 geT:function(a){return},
-gtp:function(){return C.dS},
+gtp:function(){return C.v8},
 gC5:function(){return this},
 fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
@@ -6045,7 +5625,7 @@
 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)},
+FI:function(a,b){return P.V7(this,null,this,a,b)},
 mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
 Al:function(a){return a},
 wY:function(a){return a},
@@ -6057,8 +5637,8 @@
 "^":"",
 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],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,42,43,44],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,45,43],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -6066,27 +5646,21 @@
 return P.MP(a,b,c,d,e)},
 RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
+yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
 Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
+if($.Ex().tg(0,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)
+$.Ex().h(0,a)
+try{P.T4(a,z)}finally{$.Ex().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
 return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
+WE:function(a,b,c){var z
+if($.Ex().tg(0,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)
+$.Ex().h(0,a)
+try{z.We(a,", ")}finally{$.Ex().Rz(0,a)}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
@@ -6122,15 +5696,15 @@
 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
+vW:function(a){var z,y,x,w
 z={}
-if(P.nH(a))return"{...}"
+for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
 y=P.p9("")
-try{$.Ex().push(a)
+try{$.tw().push(a)
 y.KF("{")
 z.a=!0
 J.kH(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
+y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
 z.pop()}return y.gvM()},
 bA:{
@@ -6239,8 +5813,8 @@
 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,118,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,105,"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -6277,7 +5851,7 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -6329,17 +5903,17 @@
 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
+return y==null?null:y.gS4()}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)},
+return y==null?null:y.gS4()}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()},
+return y[x].gS4()},
 u:function(a,b,c){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Jc()
@@ -6353,7 +5927,7 @@
 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)
+if(w>=0)x[w].sS4(b)
 else x.push(this.pE(a,b))}},
 to:function(a,b){var z
 if(this.x4(a))return this.t(0,a)
@@ -6371,7 +5945,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gcA()},
+return w.gS4()},
 V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -6382,19 +5956,19 @@
 aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
+for(;z!=null;){b.$2(z.gkh(),z.gS4())
 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)},
+else z.sS4(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()},
+return z.gS4()},
 pE:function(a,b){var z,y
 z=new P.aj(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -6426,8 +6000,8 @@
 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,118,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,105,"call"],
 $isEH:true},
 pk:{
 "^":"Tp;a",
@@ -6435,7 +6009,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 aj:{
-"^":"a;kh<,cA@,DG@,zQ@"},
+"^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
 "^":"mW;Fb",
 gB:function(a){return this.Fb.X5},
@@ -6467,7 +6041,7 @@
 return!0}}}},
 jg:{
 "^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
+gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -6498,15 +6072,15 @@
 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
+z=y}return this.cA(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(b)},
+x=y}return this.cA(x,b)}else return this.NZ(b)},
 NZ:function(a){var z,y,x
 z=this.OB
-if(z==null){z=P.V5()
+if(z==null){z=P.jB()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null)z[y]=[a]
@@ -6552,7 +6126,7 @@
 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
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
 this.DM=null
 return!0},
@@ -6568,11 +6142,19 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{V5:function(){var z=Object.create(null)
+static:{jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
-cN:{
+YO:{
+"^":"jg;X5,vv,OX,OB,DM",
+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){x=a[y]
+if(x==null?b==null:x===b)return y}return-1}},
+oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -6628,12 +6210,12 @@
 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
+z=y}return this.cA(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(b)},
+x=y}return this.cA(x,b)}else return this.NZ(b)},
 NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.T2()
@@ -6660,7 +6242,7 @@
 this.vv=null
 this.X5=0
 this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
 return!0},
 Nv:function(a,b){var z
@@ -6722,9 +6304,9 @@
 "^":"Vj;"},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"mW")},31],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},28],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},28],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -6801,8 +6383,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},28],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},28],
 eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6853,7 +6435,7 @@
 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},
-kJ:function(a,b){return this.XU(a,b,0)},
+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
@@ -6884,7 +6466,7 @@
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
@@ -7041,12 +6623,12 @@
 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.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lfu")},31],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},28],
 bu:function(a){return P.WE(this,"{","}")},
 ev:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"nf",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},28],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -7073,12 +6655,12 @@
 $asQV:null},
 Vj:{
 "^":"lfu;"},
-oz:{
+qv:{
 "^":"a;G3>,Bb>,T8>",
-$isoz:true},
+$isqv:true},
 jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
+"^":"qv;P*,G3,Bb,T8",
+$asqv:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
@@ -7143,8 +6725,8 @@
 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])
+y=H.VM(new P.HW(this,H.VM([],[P.qv]),this.qT,this.bb,null),[z])
+y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gG3(x),z.gP(x))}},
@@ -7163,9 +6745,9 @@
 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])}}},
+return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -7203,7 +6785,7 @@
 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=new P.DN(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,0))
 return y},
@@ -7214,7 +6796,7 @@
 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=new P.ZM(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,1))
 return y},
@@ -7231,7 +6813,7 @@
 HW:{
 "^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 Uw:function(a,b){var z=b==null?new P.hW():b
 return z.$2(null,new P.f1(z).$1(a))},
@@ -7242,13 +6824,13 @@
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
-NC:[function(a){return a.Bu()},"$1","bx",2,0,49,50],
+NC:[function(a){return a.Lt()},"$1","bx",2,0,46,47],
 hW:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -7276,7 +6858,7 @@
 "^":"Ud;Ct,FN",
 bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
+D4:{
 "^":"Wf;qa<,fO",
 pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
@@ -7293,13 +6875,13 @@
 "^":"zF;qa<",
 $aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;fO,cS,ol",
+"^":"a;fO,p8,ol",
 iY:function(a){return this.fO.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cS
+x=this.p8
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -7357,24 +6939,24 @@
 throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cS.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cS.KF("true")
-return!0}else if(a===!1){this.cS.KF("false")
-return!0}else if(a==null){this.cS.KF("null")
-return!0}else if(typeof a==="string"){z=this.cS
+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.cS
+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.cS
+y=this.p8
 y.KF("{")
 for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
@@ -7386,7 +6968,7 @@
 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,Wk,BLm,vk,MU,mrt,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"P3,hyY,IE,Jyf,NoV,HVe,Wk,pe,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.bx()
 z=P.p9("")
 P.uI(z,b,c).C7(a)
@@ -7446,7 +7028,7 @@
 if(typeof c!=="number")return H.s(c)
 z=this.IT
 y=z.length
-x=J.Qe(a)
+x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
 if(v<=127){u=this.L8
@@ -7477,7 +7059,7 @@
 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],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,48,43,44],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -7497,8 +7079,8 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,52],
-QP:[function(a){return H.CU(a)},"$1","V4",2,0,53],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,49],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,50],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -7518,18 +7100,18 @@
 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
+t=(a[t]&C.jn.KI(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},
 Y25:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Tp:119;a",
+"^":"Tp:106;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(a.gfN())
@@ -7564,7 +7146,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,Kw,h2,mo,EQe,Qg,Hm,Xs,Fz,LC,E03,KeL,Cgd,NrX,Dk,o4I,T3F,ek0,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp8,Eu,Kw,h2,mo,EQe,Qg,tp1,Xs,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,PW,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -7611,12 +7193,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Tp:120;",
+"^":"Tp:107;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:121;",
+"^":"Tp:108;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -7652,9 +7234,9 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"YN,v7,dko,LoB,zj5,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:15;",
+"^":"Tp:12;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -7663,7 +7245,7 @@
 return"00000"+H.d(a)},
 $isEH:true},
 wr:{
-"^":"Tp:15;",
+"^":"Tp:12;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
@@ -7752,17 +7334,17 @@
 "^":"a;oc>",
 bu:function(a){return"Expando:"+H.d(this.oc)},
 t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
+return z==null?null:H.of(z,this.Qz())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
+H.R0(b,"expando$values",z)}H.R0(z,this.Qz(),c)},
+Qz:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Ss"}},
+H.R0(this,"expando$key",z)}return z},
+static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -7813,10 +7395,10 @@
 $isqU:true},
 "+String":0,
 WU:{
-"^":"a;Cb,R7,C3,Wn",
+"^":"a;Cb,R7,Oq,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.Oq
 this.R7=z
 y=this.Cb
 x=y.length
@@ -7824,9 +7406,9 @@
 return!1}w=C.xB.j(y,z)
 v=this.R7+1
 if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
+if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
+return!0}}this.Oq=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7851,35 +7433,32 @@
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
 return z}}},
-GD:{
+IN:{
 "^":"a;",
-$isGD:true},
+$isIN:true},
 uq:{
 "^":"a;",
 $isuq:true},
 rI:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 r3:function(a,b){return document.createElement(a)},
-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.fd(0,z.bi,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.fd(0,z.bi,z.Ph,W.aF(y.gXN()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
+pS:function(a,b){var z,y
+z=typeof a!=="string"
+if((!z||a==null)&&!0)return new WebSocket(a)
+y=H.RB(b,"$isWO",[P.qU],"$asWO")
+if(!y);y=!z||a==null
+if(y)return new WebSocket(a,b)
+z=!z||a==null
+if(z)return new WebSocket(a,b)
+throw H.b(P.u("Incorrect number or type of arguments"))},
 VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
@@ -7893,23 +7472,22 @@
 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.UC(a)},"$1","Z6",2,0,13,54],
-Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,55,54,56,57,58],
+Xw:function(a,b){return new W.uY(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,51],
+Hx:[function(a){return J.UC(a)},"$1","Z6",2,0,10,51],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,52,51,53,54,55],
 aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
 return $.X3.Nf(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Vct|i6|Xfs|JI|D13|ZP|WZq|nJ|SaM|Eg|i7|pva|Gk|cda|Nr|waa|MJ|T53|DK|V3|BS|V9|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|qh|V15|oF|V16|Q6|uE|V17|Zn|V18|n5|V19|Ma|wN|V20|ds|V21|ou|ZzR|av|V22|uz|V23|kK|oa|V24|St|V25|IW|V26|Qh|V27|Oz|V28|YA|V29|qk|V30|vj|LU|V31|CX|V32|md|V33|Bm|V34|Ya|V35|Ww|ye|V36|G1|V37|fl|V38|UK|V39|wM|V40|F1|V41|ov|oEY|kn|V42|fI|V43|zM|V44|Rk|V45|Ti|KAf|CY|V46|nm|V47|uw|I5|V48|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V3|Vb|V5|Ly|pR|V9|hx|V10|L4|Mb|V11|mO|DE|V12|U1|qh|V13|oF|V14|Q6|uE|V15|Zn|V16|n5|V17|Ma|wN|V18|ds|V19|ou|ZzR|av|V20|uz|V21|kK|oa|V22|St|V23|IW|V24|Qh|V25|Oz|V26|YA|V27|qk|V28|vj|LU|V29|CX|V30|md|V31|Bm|V32|Ya|V33|Ww|V34|G1|V35|fl|V36|UK|V37|wM|V38|F1|V39|qZ|V40|ov|oEY|kn|V41|fI|V42|zM|V43|Rk|V44|Ti|KAf|CY|V45|nm|V46|uw|I5|V47|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.M5]},
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
 "^":"Bo;N:target=,t5:type%,mH:href=,yv:protocol=",
@@ -7933,7 +7511,7 @@
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
-Ox:{
+IFv:{
 "^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
 "%":"HTMLButtonElement"},
 Ny:{
@@ -7954,8 +7532,9 @@
 Zl:{
 "^":"KV;Rn:data=,B:length=",
 "%":"Comment;CharacterData"},
-BI:{
+K3:{
 "^":"ea;tT:code=",
+$isK3:true,
 "%":"CloseEvent"},
 y4:{
 "^":"w6O;Rn:data=",
@@ -8012,7 +7591,7 @@
 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)},
+gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
 Es:function(a){this.q0(a)},
 dQ:function(a){this.Nz(a)},
 q0:function(a){},
@@ -8027,7 +7606,7 @@
 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"))},
-Ft:function(a,b){var z=a
+jn:function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
@@ -8057,7 +7636,7 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
@@ -8078,11 +7657,6 @@
 YuD:{
 "^":"Bo;B:length=,Sf:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-Me:{
-"^":"Gv;B:length=",
-f7:[function(a){return a.back()},"$0","gSk",0,0,18],
-og:[function(a){return a.forward()},"$0","gWc",0,0,18],
-"%":"History"},
 xnd:{
 "^":"ecX;",
 gB:function(a){return a.length},
@@ -8104,12 +7678,11 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
+"^":"rk;pf:status=",
 gbA:function(a){return W.Z9(a.response)},
-Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+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;",
@@ -8133,16 +7706,13 @@
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
-xT:{
+eP:{
 "^":"Bo;MB:form=",
 "%":"HTMLLabelElement"},
 mF:{
@@ -8162,13 +7732,13 @@
 eL:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+yy:[function(a){return a.pause()},"$0","gX0",0,0,15],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
 aBv:{
@@ -8194,8 +7764,8 @@
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+Oq:{
+"^":"w6O;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.ju(p))
 return},
 gD7:function(a){var z,y
@@ -8204,14 +7774,14 @@
 z=W.qc(a.target)
 y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
+$isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 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)},
+gUN:function(a){return new W.wi(a)},
 zB:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
@@ -8271,14 +7841,10 @@
 me:{
 "^":"Bo;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-dg:{
-"^":"ea;",
-$isdg:true,
-"%":"PopStateEvent"},
 j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-nC:{
+qW:{
 "^":"Zl;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
@@ -8286,12 +7852,11 @@
 "%":"HTMLProgressElement"},
 kQ:{
 "^":"ea;ox:loaded=",
-$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
-j24:{
+Tw:{
 "^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
 bs:{
@@ -8306,13 +7871,13 @@
 yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-uaa:{
+GA:{
 "^":"ea;Cf:results=",
 "%":"SpeechInputEvent"},
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-S2:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 vt:{
@@ -8321,7 +7886,7 @@
 my:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 kI:{
@@ -8350,34 +7915,38 @@
 "^":"Bo;jb:content=",
 $isOH:true,
 "%":"HTMLTemplateElement"},
-HF:{
+Un:{
 "^":"Zl;",
-$isHF:true,
+$isUn:true,
 "%":"CDATASection|Text"},
 AE:{
 "^":"Bo;MB:form=,oc:name%,WT:rows=,t5:type=,P:value%",
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-R0:{
+xVu:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
+li:{
 "^":"Bo;fY:kind%,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
+"%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 SW:{
 "^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
+lf:{
+"^":"PZ;yv:protocol=,O3:url=",
+LG:function(a,b,c){return a.close(b,c)},
+S6:function(a){return a.close()},
+wR:function(a,b){return a.send(b)},
+$islf:true,
+"%":"WebSocket"},
 K5:{
 "^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
 S6:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
+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()},
@@ -8423,7 +7992,7 @@
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
-rh:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -8547,10 +8116,10 @@
 z.S8(a,b)
 return z}}},
 HU:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5:{
+QI:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
@@ -8559,7 +8128,7 @@
 "^":"Jn;WK:YO<,WK",
 t:function(a,b){var z,y
 z=$.PO()
-y=J.Qe(b)
+y=J.rY(b)
 if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cq(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.Cq(this.YO,b,!1),[null])},
 static:{"^":"Ha"}},
@@ -8577,22 +8146,6 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:75;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.rC(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
 wi:{
 "^":"rm;NL",
 grZ:function(a){var z=this.NL.lastChild
@@ -8717,7 +8270,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -8732,7 +8285,7 @@
 return y},
 gB:function(a){return this.gvc().length},
 FJ:function(a){return a.namespaceURI==null}},
-iW:{
+ye:{
 "^":"As3;QX,Kd",
 lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
@@ -8741,20 +8294,20 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.iW(a,null)
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Zu()),[null,null])},
+static:{or:function(a){var z=new W.ye(a,null)
 z.yJ(a)
 return z}}},
-Xw:{
-"^":"Tp:13;",
+Zu:{
+"^":"Tp:10;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
@@ -8767,8 +8320,8 @@
 J.Pw(this.MW,a.zV(0," "))}},
 FkO:{
 "^":"a;Ph",
-zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.zc(a,!1)}},
+DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+LX:function(a){return this.DT(a,!1)}},
 RO:{
 "^":"cb;bi,Ph,Sg",
 KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
@@ -8783,11 +8336,11 @@
 return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"cb",0),null])},
 $iscb:true},
 ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.Sq(J.l2(a),this.a)},
+"^":"Tp:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 tS:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8807,11 +8360,11 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $iscb:true},
 i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.Sq(J.l2(a),this.a)},
+"^":"Tp:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8824,10 +8377,10 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Jc()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,114,23,115],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,101,20,102],
 gUF:function(){return this.VP>0},
 zl:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
+this.Zz()},"$0","gDQ",0,0,15],
 Zz:function(){var z=this.G9
 if(z!=null&&this.VP<=0)J.FI(this.bi,this.Ph,z,this.Sg)},
 Jc:function(){var z=this.G9
@@ -8844,10 +8397,10 @@
 S6:[function(a){var z,y
 for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.S6(0)},"$0","gJK",0,0,18],
+this.aV.S6(0)},"$0","gJK",0,0,15],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 rC:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -8884,7 +8437,7 @@
 XP:function(a,b){J.br(this.xa,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return J.q6(this.xa,b,c)},
-kJ:function(a,b){return this.XU(a,b,0)},
+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)},
@@ -8907,17 +8460,17 @@
 return!1},
 gl:function(){return this.QZ}},
 uY:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
+return this.a(a)},"$1",null,2,0,null,51,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 S6:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
+kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
@@ -8932,7 +8485,7 @@
 "%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
 "^":"",
 Y0:{
-"^":"tpr;N:target=,mH:href=",
+"^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
 ZJQ:{
 "^":"Pt;mH:href=",
@@ -8943,7 +8496,7 @@
 bd:{
 "^":"MB;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-vA:{
+R8:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 nQ:{
@@ -8964,25 +8517,25 @@
 mz:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-Ob:{
+vz:{
 "^":"MB;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-oBW:{
+Tf:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-wC:{
+yum:{
 "^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-Lj:{
+MI:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-Ub:{
+rg:{
 "^":"MB;x=,y=",
 "%":"SVGFEPointLightElement"},
 bMB:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"MB;x=,y=",
 "%":"SVGFESpotLightElement"},
 Qya:{
@@ -8995,16 +8548,16 @@
 "^":"MB;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 mg:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 "%":"SVGForeignObjectElement"},
 TQ:{
-"^":"tpr;",
+"^":"zp;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
+zp:{
 "^":"MB;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 SL:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"MB;x=,y=",
@@ -9015,7 +8568,7 @@
 NJ:{
 "^":"TQ;x=,y=",
 "%":"SVGRectElement"},
-qIR:{
+nd:{
 "^":"MB;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
@@ -9035,12 +8588,12 @@
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"OY<"}},
 hy:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
-"^":"tpr;",
+"^":"zp;",
 "%":";SVGTextContentElement"},
 xN:{
 "^":"mHq;Sf:method=,mH:href=",
@@ -9049,7 +8602,7 @@
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 ci:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
 "^":"MB;mH:href=",
@@ -9068,26 +8621,16 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-hM:function(){var z,y,x
-z=$.Fd
-$.Fd=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.A1(y,null)
-x.TL(y)
-return x},
-hq:{
+wC:{
 "^":"a;",
-$ishq:true,
+$iswC:true,
 static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
 xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,38,56,24,57],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -9101,7 +8644,7 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,10,58],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -9112,7 +8655,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,46,58],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
 else return P.iQ(a,$.LZ(),new P.QS())},
@@ -9149,7 +8692,7 @@
 return P.ND(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9160,7 +8703,7 @@
 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"],
+return v}else return P.wY(a)},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -9172,7 +8715,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
 Tz:{
-"^":"F6;eh",
+"^":"WkF;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
@@ -9206,7 +8749,7 @@
 Jd:function(a){return this.XP(a,null)},
 static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
-F6:{
+WkF:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -9214,25 +8757,25 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -9376,18 +8919,48 @@
 $isEX:true},
 IV:{
 "^":"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
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
+if(typeof z!=="number")return z.g()
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
+if(typeof z!=="number")return z.g()
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 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
+y=this.gBb(this)
+x=z.gBb(b)
+if(y==null?x==null:y===x){y=this.G6
+x=z.gG6(b)
+if(y==null?x==null:y===x){x=this.Bb
+w=this.R
+if(typeof x!=="number")return x.g()
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}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))},
+giO:function(a){var z,y,x,w,v,u
+z=J.v1(this.gBb(this))
+y=this.G6
+x=J.v1(y)
+w=this.Bb
+v=this.R
+if(typeof w!=="number")return w.g()
+if(typeof v!=="number")return H.s(v)
+u=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof u!=="number")return H.s(u)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
 gSR:function(a){var z=new P.EX(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9396,13 +8969,17 @@
 $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
+if(typeof c!=="number")return c.C()
+if(c<0)z=-c*0
+else z=c
+if(typeof d!=="number")return d.C()
+if(d<0)y=-d*0
+else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
-"^":"mA;Rp"},
+"^":"mA;EV"},
 mA:{
 "^":"Nx+cw;",
 $isZ0:true},
@@ -9414,19 +8991,19 @@
 $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
+t:function(a,b){return this.EV.t(0,b)},
+u:function(a,b,c){this.EV.u(0,b,c)},
+FV:function(a,b){this.EV.FV(0,b)},
+V1:function(a){this.EV.V1(0)},
+aN:function(a,b){this.EV.aN(0,b)},
+gl0:function(a){return this.EV.X5===0},
+gor:function(a){return this.EV.X5!==0},
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
+gB:function(a){return this.EV.X5},
+gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 ic:function(a){a.toString
@@ -9448,7 +9025,7 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $ispF:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;we|Ob|GVy|Dg|Ui|Ipv|Pg"},
 di:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -9470,7 +9047,7 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
 gbx:function(a){return C.G0},
 t:function(a,b){var z=a.length
@@ -9504,7 +9081,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.XI},
+gbx:function(a){return C.KS},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9552,7 +9129,7 @@
 "%":"Uint16Array"},
 rs:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
+gbx:function(a){return C.dH},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9626,7 +9203,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]}},
-Ui:{
+Ob:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
@@ -9634,7 +9211,7 @@
 $isQV:true,
 $asQV:function(){return[P.CP]}},
 GVy:{
-"^":"Ui+h5;"},
+"^":"Ob+Lj;"},
 Pg:{
 "^":"Ipv;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
@@ -9646,7 +9223,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-ObS:{
+Ui:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
@@ -9654,7 +9231,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+h5;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"Ui+Lj;"}}],["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)
@@ -9663,10 +9240,10 @@
 return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Vct;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y,x,w
+static:{Yw:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9678,12 +9255,12 @@
 C.OD.ZL(a)
 C.OD.XI(a)
 return a}}},
-D13:{
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 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},
@@ -9698,7 +9275,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,100,1,94,95],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,88,1,89,90],
 Z1:[function(a,b,c,d){var z,y,x
 J.fD(b)
 z=a.a3
@@ -9707,9 +9284,9 @@
 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,100,1,94,95],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,88,1,89,90],
 YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,122,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,109,1],
 static:{Rp:function(a){var z,y,x,w,v
 z=R.tB([])
 y=$.XZ()
@@ -9722,15 +9299,15 @@
 a.on=y
 a.BA=x
 a.LL=v
-C.zg.ZL(a)
-C.zg.XI(a)
+C.Gh.ZL(a)
+C.Gh.XI(a)
 return a}}},
-WZq:{
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -9751,7 +9328,7 @@
 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)).wM(new R.Ou(a))}},"$3","gbN",6,0,79,46,47,80],
+this.LY(a,a.jv).ml(new R.uv(a)).wM(new R.Ou(a))}},"$3","gbN",6,0,73,43,44,74],
 static:{fL:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -9770,15 +9347,15 @@
 C.UF.XI(a)
 return a}}},
 SaM:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 uv:{
-"^":"Tp:124;a",
+"^":"Tp:111;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,81,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
 Ou:{
-"^":"Tp:69;b",
+"^":"Tp:66;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,{
@@ -9800,10 +9377,10 @@
 return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,17,84],
 static:{Sy:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -9813,19 +9390,19 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.D4.ZL(a)
-C.D4.XI(a)
+C.by.ZL(a)
+C.by.XI(a)
 return a}}},
-pva:{
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
 "^":"",
 Nr:{
-"^":"cda;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"pva;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,20,91],
-static:{TsF:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,17,84],
+static:{na:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9834,14 +9411,14 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.n0.ZL(a)
-C.n0.XI(a)
+C.uG.ZL(a)
+C.uG.XI(a)
 return a}}},
-cda:{
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"cda;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gJ6:function(a){return a.Zc},
 sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{Bs:function(a){var z,y,x,w
@@ -9856,14 +9433,14 @@
 C.Cl.ZL(a)
 C.Cl.XI(a)
 return a}}},
-waa:{
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Dw,Yq,Yr,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gU4:function(a){return a.PQ},
-sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
+"^":"T53;ay,MC,oX,Oc,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gU4:function(a){return a.ay},
+sU4:function(a,b){a.ay=this.ct(a,C.QK,a.ay,b)},
 Qj:[function(a,b){var z,y,x
 Q.xI.prototype.Qj.call(this,a,b)
 this.ct(a,C.ak,0,1)
@@ -9872,28 +9449,28 @@
 y=z!=null
 if(y){x=J.U6(z)
 x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
-a.Yr=this.ct(a,C.a0,a.Yr,x)
+a.Oc=this.ct(a,C.a0,a.Oc,x)
 x=y&&J.UQ(z,"parent")!=null
-a.Dw=this.ct(a,C.ak,a.Dw,x)
+a.MC=this.ct(a,C.ak,a.MC,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.Yq=this.ct(a,C.Ql,a.Yq,y)},"$1","gLe",2,0,20,57],
-gSY:function(a){return a.Dw},
-sSY:function(a,b){a.Dw=this.ct(a,C.ak,a.Dw,b)},
-gE7:function(a){return a.Yq},
-sE7:function(a,b){a.Yq=this.ct(a,C.Ql,a.Yq,b)},
-gni:function(a){return a.Yr},
-sni:function(a,b){a.Yr=this.ct(a,C.a0,a.Yr,b)},
+a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,17,54],
+gSY:function(a){return a.MC},
+sSY:function(a,b){a.MC=this.ct(a,C.ak,a.MC,b)},
+gE7:function(a){return a.oX},
+sE7:function(a,b){a.oX=this.ct(a,C.Ql,a.oX,b)},
+gni:function(a){return a.Oc},
+sni:function(a,b){a.Oc=this.ct(a,C.a0,a.Oc,b)},
 static:{E5:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.PQ=!0
-a.Dw=!1
-a.Yq=!1
-a.Yr=!1
+a.ay=!0
+a.MC=!1
+a.oX=!1
+a.Oc=!1
 a.Pe=!1
 a.on=z
 a.BA=y
@@ -9906,7 +9483,7 @@
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 BS:{
-"^":"V3;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 gUx:function(a){return a.Sq},
@@ -9954,9 +9531,9 @@
 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.LE(a.P6).wM(b)},"$1","gvC",2,0,20,91],
-static:{nz:function(a){var z,y,x,w
+break}},"$1","gnp",2,0,17,54],
+RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,17,84],
+static:{N0:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9968,15 +9545,15 @@
 C.cI.ZL(a)
 C.cI.XI(a)
 return a}}},
-V3:{
+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,125],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,112],
 gvH:function(a){return C.CD.cU(this.mS,4)},
-static:{"^":"Q0z",Iu:function(a,b){var z,y,x
+static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
 y=J.DO(a)
 if(typeof z!=="number")return z.U()
@@ -9987,7 +9564,7 @@
 uc:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"V9;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V3;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -10011,15 +9588,16 @@
 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.tn(a,c,"Free",$.Rl())
+u=J.U6(v)
+if(!J.xC(u.t(v,"type"),"@Class")){N.QM("").To(H.d(v))
+continue}t=H.BU(C.Nm.grZ(J.uH(u.t(v,"id"),"/")),null,null)
+s=t==null?C.pr:P.r2(t)
+r=[s.j1(128),s.j1(128),s.j1(128),255]
+u=J.uH(u.t(v,"name"),"@")
+if(0>=u.length)return H.e(u,0)
+y.u(0,t,u[0])
+x.u(0,t,r)
+w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.Rl())
 this.tn(a,0,"",$.Sd())},
 WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.dW
@@ -10027,7 +9605,7 @@
 if(typeof z!=="number")return z.U()
 if(typeof y!=="number")return H.s(y)
 x=z*y
-w=C.CD.cU(O.Iu(a.An,b).mS,4)
+w=C.CD.cU(O.x6(a.An,b).mS,4)
 v=C.CD.Z(w,x)
 u=C.CD.Y(w,x)
 t=J.UQ(a.oj,"pages")
@@ -10058,21 +9636,20 @@
 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.Iu(a.An,z)
+z=O.x6(a.An,z)
 w=z.mS
 v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.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,122,2],
-X7:[function(a,b){var z=J.cR(this.WE(a,J.WS(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,122,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,109,78],
+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,109,78],
 My:function(a){var z,y,x,w
 z=a.oj
 if(z==null||a.hi==null)return
 this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
 y=J.UQ(a.oj,"pages")
 z=a.hi.parentElement
-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
+x=P.T7(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
 z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
@@ -10095,7 +9672,7 @@
 x=a.dW
 if(typeof x!=="number")return H.s(x)
 w=b*x
-v=O.Iu(a.An,H.VM(new P.EX(0,w),[null]))
+v=O.x6(a.An,H.VM(new P.EX(0,w),[null]))
 u=J.UQ(y.t(z,b),"objects")
 y=J.U6(u)
 x=a.rM
@@ -10133,8 +9710,8 @@
 P.Iw(new O.R5(a,b),null)},
 RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,20,91],
-nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,17,84],
+nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,54],
 static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -10153,31 +9730,31 @@
 C.Cs.ZL(a)
 C.Cs.XI(a)
 return a}}},
-V9:{
+V3:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,126,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 aO:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 oc:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 Ly:{
-"^":"V10;GQ,I8,Oc,GM,nc,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+"^":"V5;GQ,I8,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 q0:function(a){var z,y,x
@@ -10198,7 +9775,7 @@
 MQ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isWO||J.xC(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.B7()
+a.Rp.B7()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
@@ -10210,7 +9787,7 @@
 r=this.zh(a,y,6)
 q=this.zh(a,y,7)
 p=this.zh(a,y,8)
-J.Jr(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.tO(a.nc)
+J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
 z=a.GQ.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
@@ -10233,23 +9810,23 @@
 v=[]
 C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
 w.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc.Yb
+v=a.JS.Yb
 v.V7("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-v=a.Oc
+v=a.JS
 w=J.U6(o)
 x=w.t(o,"used")
 v=v.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
 v.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc
+z=a.JS
 v=J.Hn(w.t(o,"capacity"),w.t(o,"used"))
 z=z.Yb
 x=[]
 C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
 z.V7("addRow",[H.VM(new P.Tz(x),[null])])
-x=a.Oc
+x=a.JS
 w=w.t(o,"external")
 x=x.Yb
 z=[]
@@ -10259,12 +9836,12 @@
 z5:function(a){var z=a.I8
 if(z==null)return
 z.W2(a.GQ)
-a.GM.W2(a.Oc)},
-JL:[function(a,b,c,d){var z,y
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+a.GM.W2(a.JS)},
+BB:[function(a,b,c,d){var z,y
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.tO(a.nc)}}},"$3","gQq",6,0,93,1,94,95],
+if(z==null?y!=null:z!==y){a.Rp.sxp(y)
+J.II(a.Rp)}}},"$3","gQq",6,0,116,1,89,90],
 K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
@@ -10288,50 +9865,50 @@
 return J.ew(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
 RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,20,91],
-QH:[function(a,b){var z=a.Ol
+J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,17,84],
+zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,20,91],
+J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,84],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,20,91],
+J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,84],
 n1:[function(a,b){var z,y,x,w
 try{this.MQ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,20,57],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,54],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,129,130],
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,117,118],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,129,130],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,117,118],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,129,130],
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,117,118],
 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)
+a.JS=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
+a.JS.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new G.Vz([new G.zb("Class",G.Q8()),new G.zb("Accumulator Size (New)",G.Fx()),new G.zb("Accumulator (New)",G.kh()),new G.zb("Current Size (New)",G.Fx()),new G.zb("Current (New)",G.kh()),new G.zb("Accumulator Size (Old)",G.Fx()),new G.zb("Accumulator (Old)",G.kh()),new G.zb("Current Size (Old)",G.Fx()),new G.zb("Current (Old)",G.kh())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.Ktd("Class",G.HP()),new G.Ktd("Accumulator Size (New)",G.Fx()),new G.Ktd("Accumulator (New)",G.kh()),new G.Ktd("Current Size (New)",G.Fx()),new G.Ktd("Current (New)",G.kh()),new G.Ktd("Accumulator Size (Old)",G.Fx()),new G.Ktd("Accumulator (Old)",G.kh()),new G.Ktd("Current Size (Old)",G.Fx()),new G.Ktd("Current (Old)",G.kh())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(1)},
-static:{"^":"IJv,bQj,tpX,wh,r1K,d6,rW,DY2",Ut:function(a){var z,y,x,w
+static:{"^":"IJv,bQj,kf,wh,r1K,qEV,pC,DY2",Ut:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10344,38 +9921,38 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V10:{
+V5:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 jm:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 AN:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 Ao:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 ke:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 xj:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
-pf:function(a){var z,y
+bL:function(a){var z,y
 z=[]
 y=new P.Kk(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
 new P.uS().$0()
@@ -10395,7 +9972,7 @@
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 wF:{
-"^":"Tp:48;b,c",
+"^":"Tp:45;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10405,23 +9982,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Tp:131;d",
+"^":"Tp:119;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"Tp:132;e",
+"^":"Tp:120;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;",
+"^":"Tp:66;",
 $0:function(){},
 $isEH:true},
 Kk:{
-"^":"Tp:13;f,UI,bK",
+"^":"Tp:10;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -10455,11 +10032,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 q1:{
-"^":"Tp:75;a,Gq",
+"^":"Tp:69;a,Gq",
 $2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:48;a,b",
+"^":"Tp:45;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10469,19 +10046,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Tp:131;c",
+"^":"Tp:119;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:132;d",
+"^":"Tp:120;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",
+"^":"Tp:10;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10522,11 +10099,11 @@
 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,133,31],
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,121,28],
 ev: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.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,134,31],
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,122,28],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10555,19 +10132,19 @@
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 Fe:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"rm;NJ,iz",
+"^":"rm;Yn,iz",
 gye:function(){var z=this.iz
 return P.F(z.ev(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gye(),b)},
@@ -10601,11 +10178,11 @@
 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;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -10618,14 +10195,14 @@
 else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,66],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,135,136,91],
+c.$0()}},"$2","gNe",4,0,123,124,84],
 static:{lu:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10640,26 +10217,26 @@
 C.EL.XI(a)
 return a}}},
 qB:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,123,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":"V11;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V9;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,137,99],
-ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,137,33],
-RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,20,91],
+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,85,86],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,125,87],
+ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,125,30],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,17,84],
 static:{BN:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10672,20 +10249,20 @@
 C.ry.ZL(a)
 C.ry.XI(a)
 return a}}},
-V11:{
+V9:{
 "^":"uL+Pi;",
 $isd3:true},
 cL:{
-"^":"Tp:124;a",
+"^":"Tp:111;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,81,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,79,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
-"^":"V12;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V10;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,17,84],
 static:{p4:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10698,12 +10275,12 @@
 C.za.ZL(a)
 C.za.XI(a)
 return a}}},
-V12:{
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{RVI:function(a){var z,y,x,w
+static:{pD:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10717,10 +10294,10 @@
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V11;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{Ch:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10733,7 +10310,7 @@
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V13:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
@@ -10752,13 +10329,13 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V12;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,20,91],
-TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,18],
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,17,84],
+TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -10776,13 +10353,13 @@
 C.NK.ZL(a)
 C.NK.XI(a)
 return a}}},
-V14:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 eG:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qh:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
@@ -10800,10 +10377,10 @@
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{J3z:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10816,14 +10393,14 @@
 C.Tl.ZL(a)
 C.Tl.XI(a)
 return a}}},
-V15:{
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V16;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V14;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,17,84],
 static:{chF:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10833,10 +10410,10 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.rU.ZL(a)
-C.rU.XI(a)
+C.to.ZL(a)
+C.to.XI(a)
 return a}}},
-V16:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
@@ -10855,10 +10432,10 @@
 C.Rr.XI(a)
 return a}}},
 Zn:{
-"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{xK:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10871,15 +10448,15 @@
 C.ij.ZL(a)
 C.ij.XI(a)
 return a}}},
-V17:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V18;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V16;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,20,91],
-static:{NZ:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,17,84],
+static:{xx:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10891,14 +10468,14 @@
 C.aV.ZL(a)
 C.aV.XI(a)
 return a}}},
-V18:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{Ii:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10911,7 +10488,7 @@
 C.iR.ZL(a)
 C.iR.XI(a)
 return a}}},
-V19:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
@@ -10926,17 +10503,17 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.J0.ZL(a)
-C.J0.XI(a)
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V20;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V18;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,20,91],
-Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,18],
+RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,17,84],
+Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -10954,19 +10531,19 @@
 C.wP.ZL(a)
 C.wP.XI(a)
 return a}}},
-V20:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Gf:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 ou:{
-"^":"V21;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{dv:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10979,13 +10556,13 @@
 C.lX.ZL(a)
 C.lX.XI(a)
 return a}}},
-V21:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
 "^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
+sEQ:function(a,b){a.CB=this.ct(a,C.fV,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11004,14 +10581,14 @@
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V22;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V20;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,20,91],
-Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,18],
+RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,17,84],
+Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -11029,13 +10606,13 @@
 C.bZ.ZL(a)
 C.bZ.XI(a)
 return a}}},
-V22:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
@@ -11061,7 +10638,7 @@
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.wV)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
@@ -11076,7 +10653,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V23;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,AQ,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V21;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gB1:function(a){return a.ix},
 sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
 gPL:function(a){return a.fv},
@@ -11118,25 +10695,31 @@
 a.zo=this.ct(a,C.aH,a.zo,v)
 J.aT(a.ix).N3(a.ix)
 J.kW(a.ix,"threshold",z)
-this.Dq(a)},"$1","gd0",2,0,20,57],
+this.Dq(a)},"$1","gd0",2,0,17,54],
 q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
 this.Dq(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,54],
 RF:[function(a,b){var z="profile?tags="+H.d(a.VH)
-J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,20,91],
+J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,17,84],
 Dq:function(a){if(a.ix==null)return
 this.a8(a)},
-a8:function(a){var z,y,x,w,v
+a8:function(a){var z,y,x,w,v,u,t
 z=J.aT(a.ix).gBC()
 if(z==null)return
-try{a.Hm.rT(X.SJ(a.ix,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
+try{w=a.Hm
+v=X.SJ(a.ix,z,z,null)
+w=w.WT
+u=J.w1(w)
+u.V1(w)
+v.C4(0)
+u.FV(w,v.ks)}catch(t){w=H.Ru(t)
+y=w
+x=new H.XO(t,null)
 N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.WT),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,92,88],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,92,88],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,126,81],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,126,81],
 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
@@ -11147,7 +10730,7 @@
 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],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,116,1,89,90],
 static:{"^":"B6",os:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11162,20 +10745,20 @@
 a.fJ=""
 a.XX=0.0002
 a.VH="uv"
-a.AQ="#tableTree"
+a.EX="#tableTree"
 a.on=z
 a.BA=y
 a.LL=w
 C.kS.ZL(a)
 C.kS.XI(a)
 return a}}},
-V23:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,138,"call"],
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,127,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -11195,10 +10778,10 @@
 return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 St:{
-"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V22;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{N5:function(a){var z,y,x,w
+static:{JR:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11207,19 +10790,19 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.B2.ZL(a)
-C.B2.XI(a)
+C.Hj.ZL(a)
+C.Hj.XI(a)
 return a}}},
-V24:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V23;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,139,14],
-jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,139,14],
-static:{dmb:function(a){var z,y,x,w
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,128,11],
+jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,128,11],
+static:{dm:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11231,19 +10814,19 @@
 C.F2.ZL(a)
 C.F2.XI(a)
 return a}}},
-V25:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 Qh:{
-"^":"V26;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -11258,11 +10841,11 @@
 C.kd.ZL(a)
 C.kd.XI(a)
 return a}}},
-V26:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V27;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{RP:function(a){var z,y,x,w
@@ -11277,7 +10860,7 @@
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V27:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
@@ -11295,7 +10878,7 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 YA:{
-"^":"V28;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V26;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 ci:[function(a,b){var z,y,x
@@ -11309,7 +10892,7 @@
 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],
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,17,54],
 static:{BP:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11322,40 +10905,40 @@
 C.wQ.ZL(a)
 C.wQ.XI(a)
 return a}}},
-V28:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-If:{
-"^":"a;XG,YT",
+EN:{
+"^":"a;X6,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.XG.Yb
+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.et(a.gaf(),"Idle")
+w=J.UU(a.gaf(),"Idle")
 v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 r=y[u].wZ
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
@@ -11365,41 +10948,40 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V29;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V27;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ck},
 sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
 vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
+return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,85,86],
+Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.ts=P.cH(P.ii(0,0,0,0,0,1),this.gJD(a))},
+a.ts=P.ww(P.ii(0,0,0,0,0,1),this.gJD(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,20,91],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,139,14],
-jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,139,14],
-static:{KM:function(a){var z,y,x,w,v
+if(z!=null)z.ed()},
+RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,17,84],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,128,11],
+jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,128,11],
+static:{Za:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
 v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
-a.LR=new L.If(new G.Kf(z),null)
+a.LR=new L.EN(new G.Kf(z),null)
 a.on=y
 a.BA=x
 a.LL=v
 C.Xe.ZL(a)
 C.Xe.XI(a)
 return a}}},
-V29:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.LR
@@ -11411,15 +10993,15 @@
 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.XG)}if(z.ts!=null)z.ts=P.cH(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,140,"call"],
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}z.ts=P.ww(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -11473,7 +11055,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V30;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V28;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -11488,7 +11070,7 @@
 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],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,17,54],
 static:{M7:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11501,7 +11083,7 @@
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V30:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
@@ -11522,12 +11104,12 @@
 return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 CX:{
-"^":"V31;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V29;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,20,91],
-static:{Dc:function(a){var z,y,x,w
+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,85,86],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,17,84],
+static:{as:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11539,7 +11121,7 @@
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V31:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11570,10 +11152,10 @@
 v=J.Lp(v)}else N.QM("").cB(w)}},
 X2:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
-Aw:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.Aw(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.dL(a,null,null)},
+ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZW(a,null,null)},
 xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
@@ -11588,9 +11170,9 @@
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isRw:true,
-static:{"^":"KT",QM:function(a){return $.tQ().to(a,new N.dG(a))}}},
+static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:69;a",
+"^":"Tp:66;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 '.'"))
@@ -11624,39 +11206,39 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,Fn,hlK,zE,JYn,lDu,uxc"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
+"^":"a;OR<,G1>,Mw,Fl<,O0,kc>,I4<",
+bu:function(a){return"["+this.OR.oc+"] "+this.Mw+": "+this.G1},
 $isHV:true,
 static:{"^":"Y1"}}}],["","main.dart",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e384())
+N.QM("").gSZ().yI(new F.e377())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.ca(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e385())},
-e384:{
-"^":"Tp:142;",
+$.Ib().MM.ml(G.vN()).ml(new F.e378())},
+e377:{
+"^":"Tp:131;",
 $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,141,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
-e385:{
-"^":"Tp:13;",
+e378:{
+"^":"Tp:10;",
 $1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
+A.YK()},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
-"^":"V32;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V30;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -11672,18 +11254,18 @@
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V32:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V33;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V31;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{EG:function(a){var z,y,x,w
+static:{yU:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11698,16 +11280,16 @@
 C.SU.ZL(a)
 C.SU.XI(a)
 return a}}},
-V33:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V34;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V32;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{JR:function(a){var z,y,x,w
+static:{vn:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11721,11 +11303,11 @@
 C.nn.ZL(a)
 C.nn.XI(a)
 return a}}},
-V34:{
+V32:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V35;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V33;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -11734,11 +11316,11 @@
 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)},
-VV:[function(a,b,c,d){var z=a.SB
+Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,100,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,88,1,89,90],
+rT:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,15],
 static:{ZC:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11753,29 +11335,11 @@
 C.J7.ZL(a)
 C.J7.XI(a)
 return a}}},
-V35:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
-ye:{
-"^":"uL;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-HN:[function(a,b,c,d){$.W5.toString
-window.history.go(1)},"$3","gWc",6,0,93,1,94,95],
-PH:[function(a,b,c,d){$.W5.toString
-window.history.go(-1)},"$3","gSk",6,0,93,1,94,95],
-static:{W1:function(a){var z,y,x,w
-z=$.XZ()
-y=P.YM(null,null,null,P.qU,W.I0)
-x=P.qU
-w=W.h4
-w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.on=z
-a.BA=y
-a.LL=w
-C.pl.ZL(a)
-C.pl.XI(a)
-return a}}},
 G1:{
-"^":"V36;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V34;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y,x,w
@@ -11791,21 +11355,21 @@
 C.lx.ZL(a)
 C.lx.XI(a)
 return a}}},
-V36:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V37;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V35;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,20,57],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,54],
 gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
+if(z!=null)return z.gHP()
 else return""},
 su6:function(a,b){},
-static:{zf:function(a){var z,y,x,w
+static:{Du:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11818,11 +11382,11 @@
 C.uF.ZL(a)
 C.uF.XI(a)
 return a}}},
-V37:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V38;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V36;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -11840,11 +11404,11 @@
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V38:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V39;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V37;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -11862,30 +11426,27 @@
 C.HR.ZL(a)
 C.HR.XI(a)
 return a}}},
-V39:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1:{
-"^":"V40;qC,i6,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V38;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-q0:function(a){var z,y
+giJ:function(a){return a.yT},
+siJ:function(a,b){a.yT=this.ct(a,C.j2,a.yT,b)},
+q0:function(a){var z
 Z.uL.prototype.q0.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.bl(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.ng("/vm",null,null,null,null,null),y,null,a,null,null,null,null)
-y.E0(a)
-a.i6=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-y.md()
-y.SC()
-y=new G.mL(z,null,null,new G.ng("/vm",null,null,null,null,null),y,null,a,null,null,null,null)
-y.Ty(a)
-a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+if(a.qC===!0){z=new U.bl(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z.md()
+z.PI()
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
+z.hq()
+a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new G.mL(new G.hq(null,"",null,null),U.bU(),null,null,null,null,null)
+z.US()
+a.yT=this.ct(a,C.j2,a.yT,z)}},
+static:{JT8:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11898,33 +11459,30 @@
 C.k0.ZL(a)
 C.k0.XI(a)
 return a}}},
-V40:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":"xc;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"ir;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 q0:function(a){A.dM.prototype.q0.call(this,a)},
 Nz:function(a){A.dM.prototype.Nz.call(this,a)},
 I9:function(a){A.dM.prototype.I9.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,143,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gwg",2,0,144,145],
 wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,146,147],
-Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,148,149],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,148,149],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,132,133],
+Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,12,13],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,134,135],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,134,135],
 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,148,149],
-Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,148,149],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,148,149],
-fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,148,149],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,148,149],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,134,135],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,134,135],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,134,135],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,134,135],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,134,135],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,148,149],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,148,149],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,148,149],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,134,135],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,134,135],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,134,135],
 static:{EE:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11934,8 +11492,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
 Ap:{
@@ -11950,8 +11508,8 @@
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gcm",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
+k0:[function(a){},"$0","gcm",0,0,15],
+NB:[function(a){a.AP=null},"$0","gym",0,0,15],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11959,7 +11517,7 @@
 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,109],
+return!0}return!1},"$0","gDx",0,0,96],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11979,10 +11537,10 @@
 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
+wR:function(){var z,y,x,w,v,u,t,s,r,q
+if($.AM)return
 if($.iq==null)return
-$.Td=!0
+$.AM=!0
 z=0
 y=null
 do{++z
@@ -11993,51 +11551,50 @@
 $.iq=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.HC(0)){if(w)y.push([u,t])
 v=!0}$.iq.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
+if(w&&v){w=$.eI()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.ax=$.iq.length
-$.Td=!1},
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.iq.length
+$.AM=!1},
 Ht:function(){var z={}
 z.a=!1
 z=new O.Nq(z)
 return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
 Nq:{
-"^":"Tp:150;a",
+"^":"Tp:136;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",
+"^":"Tp:66;a",
 $0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
+O.wR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 u3:{
-"^":"Tp:30;b",
+"^":"Tp:27;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
 $isEH:true},
 yJ:{
-"^":"Tp:69;c,d,e,f",
+"^":"Tp:66;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:151;UI",
+"^":"Tp:137;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"],
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
 $isEH:true},
 f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
+"^":"Tp:10;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,62,"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
@@ -12195,7 +11752,7 @@
 y=J.ew(z,u.Uj.G4.length)
 x=q.jr
 p=P.J(y,J.ew(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){C.Nm.W4(a,r);--r
 z=J.Hn(q.dM,q.Uj.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -12259,7 +11816,7 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
+ndx:{
 "^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
@@ -12269,56 +11826,9 @@
 return d},
 d3:{
 "^":"a;",
-gqh:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-hb:[function(){var z,y,x,w,v
-z=$.iq
-if(z==null){z=H.VM([],[F.d3])
-$.iq=z}z.push(this)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(x=H.dJ(this),z=$.mX().Me(0,new H.cu(x,null),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();){w=J.O6(z.lo)
-v=$.cp().eA.t(0,w)
-if(v==null)H.vh(O.lA("getter \""+H.d(w)+"\" in "+this.bu(0)))
-y.u(0,w,v.$1(this))}this.V2=y},"$0","gFW",0,0,18],
-L5:[function(){if(this.V2!=null)this.V2=null},"$0","gkk",0,0,18],
-HC:function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.X6(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},
 $isd3:true},
 X6:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -12333,9 +11843,9 @@
 "^":"",
 Sk:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.zdr,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,{
+gP:function(a){return this.u1},
+sP:function(a,b){this.u1=F.Wi(this,C.zdr,this.u1,b)},
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"uFU;b3@,iT,ao,AP,fn",
@@ -12358,7 +11868,7 @@
 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=new H.nH(z,b,y)
 x.$builtinTypeInfo=[null]
 if(b<0)H.vh(P.N(b))
 if(y<0)H.vh(P.N(y))
@@ -12396,7 +11906,7 @@
 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.j5(z,b,y,null).br(0)))}H.Lm(this.ao,b,c)},
+this.iH(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.aB(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
 z=this.ao
 y=z.length
@@ -12435,7 +11945,7 @@
 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=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(P.N(b))
 if(c<0)H.vh(P.N(c))
@@ -12454,7 +11964,7 @@
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.Lm(z,b,c)
+H.aB(z,b,c)
 this.On(x,z.length)
 z=this.iT
 if(z!=null){w=z.iE
@@ -12500,7 +12010,7 @@
 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,109],
+return!0}return!1},"$0","gL6",0,0,96],
 $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
@@ -12537,7 +12047,7 @@
 "^":"rm+Pi;",
 $isd3:true},
 cj:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -12595,17 +12105,17 @@
 return z}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,70,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:75;a",
+"^":"Tp:69;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;fq,Pc,op,Vq,dS",
+"^":"Ap;fq,Pc,cl,Vq,dS",
 QI:function(a){return this.Pc.$1(a)},
 EO:function(a){return this.Vq.$1(a)},
 TR:function(a,b){var z
@@ -12616,12 +12126,12 @@
 jA:[function(a){var z=this.QI(a)
 if(J.xC(z,this.dS))return
 this.dS=z
-return this.EO(z)},"$1","gv7",2,0,13,58],
+return this.EO(z)},"$1","gv7",2,0,10,55],
 S6:function(a){var z=this.fq
 if(z!=null)J.x0(z)
 this.fq=null
 this.Pc=null
-this.op=null
+this.cl=null
 this.Vq=null
 this.dS=null},
 gP:function(a){var z=this.QI(J.Vm(this.fq))
@@ -12632,7 +12142,7 @@
 yf: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
+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).$isIN){z=a
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
@@ -12645,14 +12155,14 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Br()
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
 iu:function(a,b,c){var z,y,x
 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
+return!0}}else if(!!J.x(b).$isIN){z=a
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
@@ -12660,7 +12170,7 @@
 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.bB(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Br()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -12669,49 +12179,49 @@
 if(a[0]===".")return!1
 return $.tN().zD(a)},
 WR:{
-"^":"AR;I3,pn,LG,jR,xX,jB,PV",
-geg:function(){return this.I3==null},
-sP:function(a,b){var z=this.I3
-if(z!=null)z.rL(this.pn,b)},
-gX6:function(){return 2},
+"^":"AR;yc,XF,xE,Fs,GX,W8,Wf",
+gqc:function(){return this.yc==null},
+sP:function(a,b){var z=this.yc
+if(z!=null)z.rL(this.XF,b)},
+gFH:function(){return 2},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){this.LG=L.SE(this,this.pn)
-this.Oq(!0)},
-fV:function(){this.PV=null
-this.I3=null
-this.pn=null},
-GA:function(a){this.I3.u8(this.pn,a)},
-Oq:function(a){var z,y
-z=this.PV
-y=this.I3.Tl(this.pn)
-this.PV=y
+NJ:function(){this.xE=L.SE(this,this.XF)
+this.hQ(!0)},
+kH:function(){this.Wf=null
+this.yc=null
+this.XF=null},
+nf:function(a){this.yc.VV(this.XF,a)},
+hQ:function(a){var z,y
+z=this.Wf
+y=this.yc.Tl(this.XF)
+this.Wf=y
 if(a||J.xC(y,z))return!1
-this.WP(this.PV,z)
+this.zc(this.Wf,z)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 Tv:{
-"^":"a;Ih",
-gB:function(a){return this.Ih.length},
-gl0:function(a){return this.Ih.length===0},
+"^":"a;Ld",
+gB:function(a){return this.Ld.length},
+gl0:function(a){return this.Ld.length===0},
 gPu:function(){return!0},
 bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+return H.VM(new H.lJ(this.Ld,new L.f7()),[null,null]).zV(0,".")},
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.Ih
+z=this.Ld
 y=z.length
-x=b.Ih
+x=b.Ld
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.Ih,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Ld,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -12721,20 +12231,20 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+for(z=this.Ld,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yf(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.Ih
+z=this.Ld
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
 return L.iu(a,z[y],b)},
-u8:function(a,b){var z,y,x,w
-if(!this.gPu()||this.Ih.length===0)return
-z=this.Ih
+VV:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ld.length===0)return
+z=this.Ld
 y=z.length-1
 for(x=0;a!=null;x=w){b.$1(a)
 if(x>=y)break
@@ -12747,8 +12257,8 @@
 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((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+w=$.fX().t(0,a)
 if(w!=null)return w
 if(!L.cB(a))return $.V6()
 v=[]
@@ -12759,7 +12269,7 @@
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
 v.push(t!=null?t:$.b7().I1.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
+y=$.fX()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
 u.$builtinTypeInfo=[H.Kp(y,0)]
@@ -12768,145 +12278,145 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $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,152,"call"],
+"^":"Tp:10;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().ep.t(0,a):a},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 Ul:{
-"^":"Tv;Ih",
+"^":"Tv;Ld",
 gPu:function(){return!1},
 static:{"^":"qr"}},
 MdQ:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $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:{
-"^":"AR;LG,Bg,jR,xX,jB,PV",
-geg:function(){return this.Bg==null},
-gX6:function(){return 3},
+NV:{
+"^":"AR;xE,TV,Fs,GX,W8,Wf",
+gqc:function(){return this.TV==null},
+gFH:function(){return 3},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){var z,y,x,w
-this.Oq(!0)
-for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+NJ:function(){var z,y,x,w
+this.hQ(!0)
+for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
 if(w!==C.dV){z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,this.jR,this)
-this.GA(z.gTT())
-this.LG=null
+$.xG=z}z.Nl.u(0,this.Fs,this)
+this.nf(z.gTT())
+this.xE=null
 break}}},
-fV:function(){var z,y,x,w
-this.PV=null
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+kH:function(){var z,y,x,w
+this.Wf=null
+for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
 if(w>=x)return H.e(y,w)
-J.x0(y[w])}this.Bg=null},
+J.x0(y[w])}this.TV=null},
 yN:function(a,b){var z
-if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
 if(!J.x(b).$isTv)b=L.hk(b)
-z=this.Bg
+z=this.TV
 z.push(a)
 z.push(b)},
 ti:function(a){return this.yN(a,null)},
-GA:function(a){var z,y,x,w,v
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+nf:function(a){var z,y,x,w,v
+for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.dV){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").u8(w,a)}}},
-Oq:function(a){var z,y,x,w,v,u,t,s,r
-J.Vw(this.PV,C.jn.cU(this.Bg.length,2))
-for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+H.Go(y[v],"$isTv").VV(w,a)}}},
+hQ:function(a){var z,y,x,w,v,u,t,s,r
+J.Vw(this.Wf,C.jn.cU(this.TV.length,2))
+for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
 if(s===C.dV){H.Go(t,"$isAp")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.PV,C.jn.cU(x,2),r)
-continue}w=this.PV
+if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
+continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.jB
+w=this.W8
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.PV,v))}J.kW(this.PV,v,r)
+y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
 z=!0}if(!z)return!1
-this.JQ(this.PV,y,w)
+this.Aw(this.Wf,y,w)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Ap;jR<",
-d9:function(){return this.xX.$0()},
-hM:function(a){return this.xX.$1(a)},
-Lt:function(a,b){return this.xX.$2(a,b)},
-KN:function(a,b,c){return this.xX.$3(a,b,c)},
-gcF:function(){return this.xX!=null},
-TR:function(a,b){if(this.xX!=null||this.geg())throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
-this.xX=b
-this.jB=P.J(this.gX6(),X.Zpg(b))
-this.BB()
-return this.PV},
-gP:function(a){this.Oq(!0)
-return this.PV},
-S6:function(a){if(this.xX==null)return
-this.fV()
-this.PV=null
-this.xX=null},
-di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,20,14],
-Fe:function(){var z=0
-while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
-JQ:function(a,b,c){var z,y,x,w
-try{switch(this.jB){case 0:this.d9()
+"^":"Ap;Fs<",
+TI:function(){return this.GX.$0()},
+K0:function(a){return this.GX.$1(a)},
+tH:function(a,b){return this.GX.$2(a,b)},
+Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+gL9:function(){return this.GX!=null},
+TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gFH())throw H.b(P.u("callback should take "+this.gFH()+" or fewer arguments"))
+this.GX=b
+this.W8=P.J(this.gFH(),X.Zpg(b))
+this.NJ()
+return this.Wf},
+gP:function(a){this.hQ(!0)
+return this.Wf},
+S6:function(a){if(this.GX==null)return
+this.kH()
+this.Wf=null
+this.GX=null},
+xVs:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,17,11],
+SG:function(){var z=0
+while(!0){if(!(z<1000&&this.lI()))break;++z}return z>0},
+Aw:function(a,b,c){var z,y,x,w
+try{switch(this.W8){case 0:this.TI()
 break
-case 1:this.hM(a)
+case 1:this.K0(a)
 break
-case 2:this.Lt(a,b)
+case 2:this.tH(a,b)
 break
-case 3:this.KN(a,b,c)
+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)}},
-WP:function(a,b){return this.JQ(a,b,null)}},
+zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
-"^":"a;zT,R3,ZY,bl,bV",
-TR:function(a,b){this.R3.u(0,b.gjR(),b)
-b.GA(this.gTT())},
+"^":"a;kT,Nl,rS,HN,op",
+TR:function(a,b){this.Nl.u(0,b.gFs(),b)
+b.nf(this.gTT())},
 we:[function(a){var z=J.x(a)
-if(!!z.$iswn)this.Uq(a.gRT())
-if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,153],
-Uq:function(a){var z,y
-if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
-z=this.bl
+if(!!z.$iswn)this.c1(a.gRT())
+if(!!z.$isd3)this.c1(z.gqh(a))},"$1","gTT",2,0,139],
+c1:function(a){var z,y
+if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
+z=this.HN
 y=z!=null?z.Rz(0,a):null
-if(y!=null)this.ZY.u(0,a,y)
-else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+if(y!=null)this.rS.u(0,a,y)
+else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
 CH:[function(a){var z,y,x,w,v
-if(!this.bV)return
-z=this.bl
+if(!this.op)return
+z=this.HN
 if(z==null)z=P.YM(null,null,null,null,null)
-this.bl=this.ZY
-this.ZY=z
-for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.bl=null},"$0","gSI",0,0,18],
-Hi:[function(a){var z,y
-for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.gcF())y.Pz()}this.bV=!0
-P.rb(this.gSI(this))},"$1","gp7",2,0,20,154],
+this.HN=this.rS
+this.rS=z
+for(y=this.Nl,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gL9())v.nf(this.gTT())}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.HN=null},"$0","gSI",0,0,15],
+KO:[function(a){var z,y
+for(z=this.Nl,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gL9())y.lI()}this.op=!0
+P.rb(this.gSI(this))},"$1","gCP",2,0,17,140],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,a.jR,a)
-a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+$.xG=z}z.Nl.u(0,a.Fs,a)
+a.nf(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
@@ -12916,13 +12426,13 @@
 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],
+return x}return a},"$1","Ft",2,0,10,18],
 Fk:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-fE:function(a,b){var z,y,x
+Jy:function(a,b){var z,y,x
 for(z=$.mX().Me(0,a,C.Hh),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
@@ -12948,13 +12458,13 @@
 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))
+$.Es().J4("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
+fS:[function(a){var z,y
 z=$.b7().ep.t(0,a)
 if(z==null)return!1
-y=J.Qe(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+y=J.rY(z)
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,59,60],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
 xv:function(a){A.VxC(a,new A.Sv())},
@@ -12962,7 +12472,7 @@
 if(a==null)return
 b.$1(a)
 for(z=a.firstChild;z!=null;z=z.nextSibling)A.VxC(z,b)},
-A8s:function(a,b,c){return new A.L6(a,b)},
+pf:function(a,b,c){return new A.L6(a,b)},
 h6:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
@@ -12979,7 +12489,7 @@
 $.AC=!0
 A.JP()
 $.ok=b
-for(a.length,z=H.VM(new H.a7(a,73,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+for(a.length,z=H.VM(new H.a7(a,72,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
 JP:function(){var z,y,x,w,v
 z=J.UQ($.ca(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org; if you do that be sure to include the platform polyfills."))
@@ -13003,7 +12513,7 @@
 if(z==null)return
 for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
 w=J.RE(x)
-if(J.tx(w.gyT(x)))w.mx(x,document.createElement("content",null))}}},
+if(J.tx(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
 Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
 y=y.gP1()}x=document
@@ -13021,7 +12531,7 @@
 if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
 q=v[r]
 p={}
-p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Gi(s,t),1))}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Xw(s,t),1))}
 p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
 p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
 p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
@@ -13036,7 +12546,7 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}z=this.t5
-this.Q7=A.fE(z,this.Q7)
+this.Q7=A.Jy(z,this.Q7)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
 if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
@@ -13058,10 +12568,10 @@
 if(y!=null)z.FV(0,y.gkK())
 J.Vs(this.FL).aN(0,new A.eY(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Hs("[rel=stylesheet]")
+Mi:function(){var z=this.Bg("[rel=stylesheet]")
 this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
-f6:function(){var z=this.Hs("style[polymer-scope]")
+f6:function(){var z=this.Bg("style[polymer-scope]")
 this.lD=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
 m1:function(){var z,y,x,w,v,u,t
@@ -13082,7 +12592,7 @@
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a){return this.Wz(a,null)},
+Bg:function(a){return this.Wz(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.ua("[polymer-scope="+a+"]")
@@ -13116,45 +12626,45 @@
 return z},
 $isXP:true},
 eY:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){var z,y,x
-z=J.Qe(a)
-if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
+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;",
+"^":"Tp:10;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 ua:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 ix:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Tp:155;a",
+"^":"Tp:141;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 DOe:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
 C.SP.aN(0,new A.xb(z))
 return z},
 $isEH:true},
 xb:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 A2:{
-"^":"nd;"},
+"^":"ndx;"},
 dM:{
 "^":"a;",
 Pa:function(a){var z
@@ -13224,9 +12734,9 @@
 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.bB(w):v)
+u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,156],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,142],
 B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -13248,7 +12758,7 @@
 y=J.RE(z)
 x=y.goc(z)
 w=$.zB()
-if(w.Im(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+if(w.Im(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.Bf(a,x,c,null,null)
@@ -13263,13 +12773,13 @@
 Mh:function(a,b){return J.n1(M.Ky(a),b)},
 x3:function(a){var z,y
 if(a.q9===!0)return
-$.UW().Ny("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+$.EM().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
 else z=new A.S0(null,null)
 z.jd=y
-z.ih=P.cH(C.ny,z.gv6(z))
+z.ih=P.ww(C.ny,z.gv6(z))
 a.YE=z},
 BM:[function(a){var z,y
 if(a.q9===!0)return
@@ -13279,10 +12789,10 @@
 J.DB(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,18],
+y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,15],
 dH:function(a,b){var z
-if(a.q9===!0){$.UW().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+if(a.q9===!0){$.EM().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.EM().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.YE
 if(z!=null){z.TP(0)
 a.YE=null}if(b===!0)return
@@ -13295,27 +12805,28 @@
 w=!x
 if(!x||y!=null){x=$.ps
 $.ps=x+1
-v=new L.ww(null,[],x,null,null,null)
-v.PV=[]
+v=new L.NV(null,[],x,null,null,null)
+v.Wf=[]
 a.JB=v
 if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
 v.yN(a,t)
 this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
 if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
-FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,157],
+FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,143],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gRT().w4(!1)
-w.yl(new A.V1(a,d,y))
-w.fm(0,null)
-w.y5(null)
+x=w.Lj
+w.pN=x.wY(new A.V1(a,d,y))
+w.o7=P.VH(P.Mm(),x)
+w.Bd=x.Al(P.od())
 x=H.d(b)+"__array"
 v=a.nh
 if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
@@ -13333,8 +12844,8 @@
 z=a.a6.gPS()
 if(z.gl0(z))return
 y=$.Uk()
-if(y.Im(C.eI))y.Ny("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
-this.UH(a,a,z.gvc(),this.gay(a))},
+if(y.Im(C.t4))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+this.UH(a,a,z.gvc(),this.gD4(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
@@ -13348,18 +12859,18 @@
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.Uk()
-x=y.Im(C.eI)
-if(x)y.Ny(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+x=y.Im(C.t4)
+if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
 w=a.a6.gPS()
 v=z.gt5(b)
 u=J.UQ($.pT(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.Ny("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.Ny("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gay",2,0,158,2],
+if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,144,78],
 ea:function(a,b,c,d){var z,y,x,w
 z=$.Uk()
-y=z.Im(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
+y=z.Im(C.t4)
+if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH){x=X.Zpg(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
@@ -13373,26 +12884,26 @@
 $isPZ:true,
 $isKV:true},
 dZ:{
-"^":"Tp:75;a",
+"^":"Tp:69;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",
+"^":"Tp:66;b",
 $0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){var z=J.x(a)
 if(!!z.$isdM)z.oW(a)},
 $isEH:true},
 Sv:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.DB(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
 qz:{
-"^":"Tp:75;a,b,c,d,e,f,UI",
+"^":"Tp:69;a,b,c,d,e,f,UI",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
 if(typeof a!=="number")return H.s(a)
@@ -13409,28 +12920,28 @@
 if(!q.h(0,p))continue
 o=u.t(v,a)
 s.rJ(t,x,o,b)
-$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,82,57,"call"],
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,145,54,"call"],
 $isEH:true},
 V1:{
-"^":"Tp:13;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,159,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 L6:{
-"^":"Tp:163;a,b",
+"^":"Tp:150;a,b",
 $3:[function(a,b,c){var z,y,x
 z=$.Uk()
-if(z.Im(C.eI))z.Ny("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+if(z.Im(C.t4))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
 x=C.SP.t(0,y)
 if(x!=null)y=x
-return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,160,161,162,"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 Bf:{
 "^":"Ap;I6,iU,jz,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,55],
 ho:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
@@ -13439,7 +12950,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.Fc(this.jz,v)
-return}}},"$1","gXQ",2,0,164,154],
+return}}},"$1","gXQ",2,0,151,140],
 TR:function(a,b){return J.mu(this.jz,b)},
 gP:function(a){return J.Vm(this.jz)},
 sP:function(a,b){J.Fc(this.jz,b)
@@ -13447,7 +12958,7 @@
 S6:function(a){var z=this.Jq
 if(z!=null){z.ed()
 this.Jq=null}J.x0(this.jz)}},
-xc:{
+ir:{
 "^":"Ot;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
@@ -13475,11 +12986,11 @@
 $isd3:true},
 N9:{
 "^":"uN;jw",
-pm:function(a,b,c){if(J.co(b,"on-"))return A.A8s(a,b,c)
+pm:function(a,b,c){if(J.co(b,"on-"))return A.pf(a,b,c)
 return T.uN.prototype.pm.call(this,a,b,c)}},
 zI:{
 "^":"Ap;v3,pB,U1,ED,Jq",
-zU:[function(a){var z,y,x,w,v,u
+cE:[function(a){var z,y,x,w,v,u
 z=this.v3
 y=A.tT(z)
 x=J.x(y)
@@ -13488,7 +12999,7 @@
 if(C.xB.nC(w,"@")){v=this.U1
 w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,13,2],
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,78],
 gP:function(a){return},
 TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
 z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
@@ -13496,7 +13007,7 @@
 this.Jq=z},
 S6:function(a){var z
 if(this.Jq!=null){z=$.Uk()
-if(z.Im(C.eI))z.Ny("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+if(z.Im(C.t4))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
 this.Jq.ed()
 this.Jq=null}},
 static:{tT:function(a){var z
@@ -13509,26 +13020,26 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,18]},
+this.Ws()}},"$0","gv6",0,0,15]},
 mS:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:[function(){var z=$.ln().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Tp:167;a,b",
+"^":"Tp:154;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,165,56,166,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,152,53,153,"call"],
 $isEH:true},
 v4:{
-"^":"Tp:69;c,d,e,f",
+"^":"Tp:66;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u
 z=this.d
 y=this.e
@@ -13562,57 +13073,57 @@
 return y}catch(x){H.Ru(x)
 return a}},
 Md:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a},
 $isEH:true},
 lP:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 Ra:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 wJY:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a},
 $isEH:true},
 zOQ:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 dA:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.M2(a.gvc(),new T.o8f(a)).zV(0," ")
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8f(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","dI",2,0,49,64],
+return z},"$1","dI",2,0,46,61],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","xe",2,0,49,64],
-Fm:[function(a){return a},"$1","u2",2,0,13,65],
+return z},"$1","xe",2,0,46,61],
+Fm:[function(a){return a},"$1","u2",2,0,10,62],
 o8f:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
 GL:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,168,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 uN:{
 "^":"VE;",
@@ -13631,7 +13142,7 @@
 return new T.H1(this,b,x)},
 CE:function(a){return new T.uK(this)}},
 H1:{
-"^":"Tp:163;a,b,c",
+"^":"Tp:150;a,b,c",
 $3:[function(a,b,c){var z,y
 if(!J.x(a).$isGK)a=K.xV(a,this.a.jw)
 z=!!J.x(b).$ish4
@@ -13639,103 +13150,103 @@
 if(z&&J.xC(this.b,"style"))y=T.xe()
 if(c===!0)return T.rD(this.c,a,y)
 z=y==null?T.u2():y
-return new T.tI(a,z,this.c,null,null,null)},"$3",null,6,0,null,160,161,162,"call"],
+return new T.tI(a,z,this.c,null,null,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 uK:{
-"^":"Tp:13;a",
-$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,160,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;qc,pk,jf,RU,EU,uK",
-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.uK
-y=this.Qv(a)
-this.uK=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.uK)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,169,170,64,171],
-gP:function(a){if(this.RU!=null)return this.uK
-return T.rD(this.jf,this.qc,this.pk)},
+"^":"Ap;yr,wx,n4,Fg,ML,HR",
+R5:function(a){return this.wx.$1(a)},
+WV:function(a){return this.Fg.$1(a)},
+q1:[function(a,b){var z,y
+z=this.HR
+y=this.R5(a)
+this.HR=y
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},function(a){return this.q1(a,!1)},"UV","$2$skipChanges","$1","gQp",2,3,156,157,61,158],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.rD(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.jf,b,this.qc)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
+try{z=K.jX(this.n4,b,this.yr)
+this.q1(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.jf)+"': "+H.d(y),x)}},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v,u,t
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-w=this.jf
-v=this.qc
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
+w=this.n4
+v=this.yr
 u=H.VM(new P.Sw(null,0,0,0),[null])
 u.Eo(null,null)
-z=J.NV(w,new K.Oy(v,u))
-this.jf=z
-u=z.glr().yI(this.gTJ())
+z=J.okV(w,new K.Oy(v,u))
+this.n4=z
+u=z.glr().yI(this.gQp())
 u.fm(0,new T.Tg(z))
-this.EU=u
+this.ML=u
 try{w=z
-J.NV(w,new K.Ed(v))
+J.okV(w,new K.Ed(v))
 w.gXr()
-this.LZ(z.gXr(),!0)}catch(t){w=H.Ru(t)
+this.q1(z.gXr(),!0)}catch(t){w=H.Ru(t)
 y=w
 x=new H.XO(t,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.uK},
-S6:function(a){if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.jf=H.Go(this.jf,"$isdE").KL
-this.RU=null},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.HR},
+S6:function(a){if(this.Fg==null)return
+this.ML.ed()
+this.ML=null
+this.n4=H.Go(this.n4,"$isdE").KL
+this.Fg=null},
 static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=K.ld(a,b)
+try{z=K.Cw(a,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:75;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,152,"call"],
+"^":"Tp:69;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,138,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.xx(b,this))},
+"^":"Sk;vq,u1,AP,fn",
+vb:function(a,b){this.vq.yI(new B.DH(b,this))},
 $asSk:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
-xx:{
+DH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.zdr,z.DA,a)},"$1",null,2,0,null,82,"call"],
+z.u1=F.Wi(z,C.zdr,z.u1,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-ld:function(a,b){var z,y
+Cw:function(a,b){var z,y
 z=new P.Sw(null,0,0,0)
 z.$builtinTypeInfo=[null]
 z.Eo(null,null)
-y=J.NV(a,new K.Oy(b,z))
-J.NV(y,new K.Ed(b))
+y=J.okV(a,new K.Oy(b,z))
+J.okV(y,new K.Ed(b))
 return y.gLv()},
 jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.x(w),!!v.$isMp;){if(!J.xC(v.gxS(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$iszb;){if(!J.xC(v.gxS(w),"|"))break
 x.push(v.gT8(w))
 z.a=v.gBb(w)}w=z.a
 v=J.x(w)
 if(!!v.$iselO){u=v.gP(w)
 t=C.x4
 s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.$0()
-t=z.a.gTf()
+t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(!!v.$isx9){t=w.gTf()
-u=J.O6(z.a)}else if(!!v.$isNb){t=w.gTf()
-if(J.I1(z.a)!=null){if(z.a.gre()!=null)return
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isNb){t=w.ghP()
+if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
 u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
 t=null
@@ -13743,11 +13254,11 @@
 y=new P.Sw(null,0,0,0)
 y.$builtinTypeInfo=[null]
 y.Eo(null,null)
-q=J.NV(r,new K.Oy(c,y))
-J.NV(q,new K.Ed(c))
+q=J.okV(r,new K.Oy(c,y))
+J.okV(q,new K.Ed(c))
 q.gLv()
-throw H.b(K.zq("filter must implement Transformer: "+H.d(r)))}p=K.ld(t,c)
-if(p==null)return
+throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.Cw(t,c)
+if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{z=$.b7().I1.t(0,u)
 $.cp().Cq(p,z,b)}return b},
@@ -13756,79 +13267,79 @@
 if(b==null)y=z
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
-x=new K.PF(z,y)
-if(y.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+x=new K.Ph(z,y)
+if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
 lPa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w12:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w13:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w14:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w15:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w16:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w17:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z=H.Og(P.a)
-z=H.fH(z,[z]).BD(b)
+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."))},
+throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w18:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a},
 $isEH:true},
 w19:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.jzo(a)},
 $isEH:true},
 w20:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:69;a",
-$0:function(){return H.vh(K.zq("Expression is not assignable: "+H.d(this.a.a)))},
+"^":"Tp:66;a",
+$0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
 GK:{
 "^":"a;",
@@ -13842,7 +13353,7 @@
 if(J.xC(b,"this"))return this.ku
 z=$.b7().I1.t(0,b)
 y=this.ku
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
 return!!J.x(y).$iscb?B.z4(y,null):y},
 AC:function(a){return!J.xC(a,"this")},
@@ -13856,7 +13367,7 @@
 AC:function(a){if(J.xC(this.Z0,a))return!1
 return this.eT.AC(a)},
 bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-PF:{
+Ph:{
 "^":"GK;eT>,Z3<",
 gku:function(){return this.eT.ku},
 t:function(a,b){var z=this.Z3
@@ -13891,29 +13402,29 @@
 Ed:{
 "^":"cfS;qu",
 xn:function(a){a.OJ(this.qu)},
-ky:function(a){J.NV(a.gT8(a),this)
+ky:function(a){J.okV(a.gT8(a),this)
 a.OJ(this.qu)}},
 Oy:{
 "^":"Jg;qu,lk",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
-Di:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
-z=J.NV(a.gTf(),this)
+Hs:function(a){return a.wz.RR(0,this)},
+fV:function(a){var z,y
+z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
 return y},
 CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
+z=J.okV(a.ghP(),this)
+y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
+z=J.okV(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gn8()
+w=this.gnG()
 x.toString
 y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
@@ -13921,64 +13432,64 @@
 return v},
 oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.lJ(a.ghL(),this.gn8()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Gzk(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.lJ(a.gRl(a),this.gn8()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
 YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
+z=J.okV(a.gG3(a),this)
+y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
-z=J.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
+z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(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)
+z=J.okV(a.gdc(),this)
+y=J.okV(a.gSl(),this)
+x=J.okV(a.gCW(),this)
 w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(w)
 y.sbO(w)
 x.sbO(w)
 return w},
 ky:function(a){var z,y,x
-z=J.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
 return x}},
 zD:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 Gzk:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
@@ -14009,8 +13520,8 @@
 $isc0:true,
 $ishw:true},
 Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,82,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 ev:{
 "^":"dE;Rl>,KL,bO,tj,Lv,k6",
@@ -14020,15 +13531,15 @@
 $isQb:true,
 $ishw:true},
 Ku:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){J.kW(a,J.Kt(b).gLv(),b.gv4().gLv())
 return a},
 $isEH:true},
 qR:{
 "^":"dE;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
-$asdE:function(){return[U.nu]},
-$isnu:true,
+$asdE:function(){return[U.ae]},
+$isae:true,
 $ishw:true},
 ek:{
 "^":"dE;KL,bO,tj,Lv,k6",
@@ -14049,11 +13560,11 @@
 $iselO:true,
 $ishw:true},
 OC:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 GC:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
@@ -14062,7 +13573,7 @@
 return z.gxS(z)},
 Qh:function(a){var z,y
 z=this.KL
-y=$.Js().t(0,z.gxS(z))
+y=$.qL().t(0,z.gxS(z))
 if(J.xC(z.gxS(z),"!")){z=this.wz.gLv()
 this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
 this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
@@ -14076,7 +13587,7 @@
 return z.gxS(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.qL().t(0,z.gxS(z))
+y=$.Jl().t(0,z.gxS(z))
 if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gLv()
 if(z==null)z=!1
 x=this.T8.gLv()
@@ -14086,27 +13597,27 @@
 else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gRT().yI(new K.P8(this,a))
 this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
 RR:function(a,b){return b.ex(this)},
-$asdE:function(){return[U.Mp]},
-$isMp:true,
+$asdE:function(){return[U.zb]},
+$iszb:true,
 $ishw:true},
 P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 an:{
-"^":"dE;dc<,Sl<,ru<,KL,bO,tj,Lv,k6",
+"^":"dE;dc<,Sl<,CW<,KL,bO,tj,Lv,k6",
 Qh:function(a){var z=this.dc.gLv()
-this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.ru.gLv()},
+this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.CW.gLv()},
 RR:function(a,b){return b.RD(this)},
 $asdE:function(){return[U.HB]},
 $isHB:true,
 $ishw:true},
 vl:{
-"^":"dE;Tf<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:function(a){var z,y,x
-z=this.Tf.gLv()
+z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.KL
 y=y.goc(y)
@@ -14114,57 +13625,57 @@
 this.Lv=$.cp().jD(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.T7(this)},
+RR:function(a,b){return b.fV(this)},
 $asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 WKb:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"dE;Tf<,Jn<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,Jn<,KL,bO,tj,Lv,k6",
 Qh:function(a){var z,y,x
-z=this.Tf.gLv()
+z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gRT().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.na(this,a,y))},
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.cn(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.zw(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.zw(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 zw:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return a.LT(this.d)},
 $isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.xq(a,new K.ey(this.UI))===!0)this.e.l8(this.f)},"$1",null,2,0,null,159,"call"],
+cn:{
+"^":"Tp:10;e,f,UI",
+$1:[function(a){if(J.xq(a,new K.ey(this.UI))===!0)this.e.l8(this.f)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ey:{
-"^":"Tp:13;bK",
+"^":"Tp:10;bK",
 $1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},
 $isEH:true},
 xJ:{
-"^":"dE;Tf<,re<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,re<,KL,bO,tj,Lv,k6",
 gSf:function(a){var z=this.KL
 return z.gSf(z)},
 Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
-x=this.Tf.gLv()
+x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
 if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
@@ -14172,21 +13683,21 @@
 w=$.b7().I1.t(0,z)
 this.Lv=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.K3(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}},
 RR:function(a,b){return b.ZR(this)},
 $asdE:function(){return[U.Nb]},
 $isNb:true,
 $ishw:true},
 WW:{
-"^":"Tp:13;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,46,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,43,"call"],
 $isEH:true},
-K3:{
-"^":"Tp:172;a,b,c",
-$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+vQ:{
+"^":"Tp:159;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ho:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
@@ -14195,28 +13706,28 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if(!x.$isQV&&y!=null)throw H.b(K.zq("right side of 'in' is not an iterator"))
+if(!x.$isQV&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
 if(!!x.$iswn)this.tj=y.gRT().yI(new K.OF(this,a))
 w=J.Vm(z)
 this.Lv=y==null?C.xD:J.np(x.ez(y,new K.fg(a,w)),!1)},
 RR:function(a,b){return b.ky(this)},
-$asdE:function(){return[U.X7S]},
-$isX7S:true,
+$asdE:function(){return[U.ma]},
+$isma:true,
 $ishw:true},
 OF:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 fg:{
-"^":"Tp:13;c,d",
+"^":"Tp:10;c,d",
 $1:[function(a){var z=this.d
-if(J.xC(z,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-return new K.ig(this.c,z,a)},"$1",null,2,0,null,82,"call"],
+if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+return new K.ig(this.c,z,a)},"$1",null,2,0,null,145,"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,{
+static:{xn: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
@@ -14226,7 +13737,7 @@
 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()))},
+return U.Le(H.n3(a,0,new U.VU()))},
 Zd:function(a,b){var z=J.ew(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
@@ -14238,7 +13749,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,173,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,160,1,43]},
 hw:{
 "^":"a;",
 $ishw:true},
@@ -14275,22 +13786,22 @@
 return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
 giO:function(a){return U.b1(this.Rl)},
 $isQb:true},
-nu:{
+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.$isnu&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
+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.Zd(U.Zd(0,z),y))},
-$isnu:true},
+$isae:true},
 XC:{
 "^":"hw;wz",
-RR:function(a,b){return b.Di(this)},
+RR:function(a,b){return b.Hs(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)},
@@ -14319,93 +13830,93 @@
 y=J.v1(this.wz)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $iscJ:true},
-Mp:{
+zb:{
 "^":"hw;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isMp&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$iszb&&J.xC(z.gxS(b),this.xS)&&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.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
-$isMp:true},
+$iszb:true},
 HB:{
-"^":"hw;dc<,Sl<,ru<",
+"^":"hw;dc<,Sl<,CW<",
 RR:function(a,b){return b.RD(this)},
-bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
+bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.CW)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gCW(),this.CW)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
-x=J.v1(this.ru)
+x=J.v1(this.CW)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isHB:true},
-X7S:{
+ma:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isX7S&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isma&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
 return U.Le(U.Zd(U.Zd(0,z),y))},
-$isX7S:true},
+$isma:true},
 zX:{
-"^":"hw;Tf<,Jn<",
+"^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
+bu:function(a){return H.d(this.hP)+"["+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)},
+return!!J.x(b).$iszX&&J.xC(b.ghP(),this.hP)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.Jn)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.T7(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
+"^":"hw;hP<,oc>",
+RR:function(a,b){return b.fV(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.ghP(),this.hP)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.oc)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
 Nb:{
-"^":"hw;Tf<,Sf>,re<",
+"^":"hw;hP<,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)+")"},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isNb&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.Sf)
 x=U.b1(this.re)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isNb:true},
-xs:{
-"^":"Tp:75;",
+VU:{
+"^":"Tp:69;",
 $2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
-"^":"a;rp,Sa,mV,vi",
+"^":"a;rp,AO,mV,vi",
 gQi:function(){return this.vi.lo},
-lx:function(a,b){var z
+HA:function(a,b){var z
 if(a!=null){z=this.vi.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
 if(!z)if(b!=null){z=this.vi.lo
@@ -14413,10 +13924,10 @@
 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)},
+Bp:function(){return this.HA(null,null)},
+GI:function(a){return this.HA(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.ia()
+return C.x4}var z=this.Yq()
 return z==null?null:this.tF(z,0)},
 tF:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
@@ -14425,15 +13936,15 @@
 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.ia())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
 this.Bp()
 w=this.Te()
 this.rp.toString
-a=new U.X7S(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+a=new U.ma(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
+if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.HA(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
@@ -14444,14 +13955,14 @@
 z=J.x(b)
 if(!!z.$iselO){z=z.gP(b)
 this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
+return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
 this.rp.toString
 return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 ZJ:function(a){var z,y,x,w
 z=this.vi.lo
 this.Bp()
-y=this.ia()
+y=this.Yq()
 while(!0){x=this.vi.lo
 if(x!=null)if(J.xC(J.Iz(x),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){x=this.vi.lo.gP9()
 w=z.gP9()
@@ -14463,8 +13974,8 @@
 if(!x)break
 y=this.tF(y,this.vi.lo.gP9())}x=J.Vm(z)
 this.rp.toString
-return new U.Mp(x,a,y)},
-ia:function(){var z,y,x,w
+return new U.zb(x,a,y)},
+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()
@@ -14498,7 +14009,7 @@
 case 7:return this.Xk()
 case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
 x=this.Te()
-this.lx(9,")")
+this.HA(9,")")
 this.rp.toString
 return new U.XC(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
 else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
@@ -14511,7 +14022,7 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
 z.push(this.Te())
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
+this.HA(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
@@ -14522,10 +14033,10 @@
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
-this.lx(5,":")
-z.push(new U.nu(x,this.Te()))
+this.HA(5,":")
+z.push(new U.ae(x,this.Te()))
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
+this.HA(9,"}")
 return new U.Qb(z)},
 qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
@@ -14549,13 +14060,13 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
 y.push(this.Te())
 z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
+this.HA(9,")")
 return y}return},
 Ew:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
 y=this.Te()
-this.lx(9,"]")
+this.HA(9,"]")
 return y}return},
 ef:function(){var z,y
 z=J.Vm(this.vi.lo)
@@ -14578,7 +14089,7 @@
 return y},
 Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","zp",2,0,66,67],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,63,64],
 O1:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -14587,14 +14098,14 @@
 bu:function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},
 $isO1:true},
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
+"^":"mW;F5",
+gA:function(a){var z=new K.vR(J.mY(this.F5),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.tx(this.YR)},
+gB:function(a){return J.q8(this.F5)},
+gl0:function(a){return J.tx(this.F5)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.F5
 y=J.U6(z)
 z=new K.O1(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14602,15 +14113,15 @@
 $asmW:function(a){return[[K.O1,a]]},
 $asQV:function(a){return[[K.O1,a]]}},
 vR:{
-"^":"Yl;qJ,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.qJ
-if(z.G()){this.CD=H.VM(new K.O1(this.wX++,z.gl()),[null])
-return!0}this.CD=null
+"^":"Yl;Tr,Mv,Ta",
+gl:function(){return this.Ta},
+G:function(){var z=this.Tr
+if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
+return!0}this.Ta=null
 return!1},
 $asYl:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
@@ -14657,7 +14168,7 @@
 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))
+x=H.Lw(Y.Ox(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))
@@ -14676,7 +14187,7 @@
 y.vM+=x
 this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.WJ,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.Cd,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
@@ -14713,50 +14224,70 @@
 "^":"",
 Jg:{
 "^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gn8",2,0,174,152]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,161,138]},
 cfS:{
 "^":"Jg;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Di:function(a){a.wz.RR(0,this)
+Hs:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.NV(a.gTf(),this)
+fV:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
+CU:function(a){J.okV(a.ghP(),this)
+J.okV(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)
+J.okV(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 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)
+for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 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)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
+YV:function(a){J.okV(a.gG3(a),this)
+J.okV(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)
+ex:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
+Hx:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
+RD:function(a){J.okV(a.gdc(),this)
+J.okV(a.gSl(),this)
+J.okV(a.gCW(),this)
 this.xn(a)},
-ky:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+ky:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
+this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+"^":"",
+qZ:{
+"^":"V39;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giJ:function(a){return a.GF},
+siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
+static:{RH:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Vp.ZL(a)
+C.Vp.XI(a)
+return a}}},
+V39:{
+"^":"uL+Pi;",
+$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":"V41;oX,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V40;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gBV:function(a){return a.GR},
 sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
 gMl:function(a){return a.cI},
@@ -14766,28 +14297,28 @@
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 rh:[function(a,b){this.Kn(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,20,57],
-OM:[function(a,b){this.ct(a,C.SA,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,13,57],
-fT:[function(a,b){var z,y
-z=a.oX
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,54],
+fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,17,54],
+xx:[function(a,b){this.ct(a,C.SA,0,1)
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,54],
+Jf:[function(a,b){var z,y
+z=a.Ny
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.xC(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,175,176],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,162,163],
 Kn:function(a){var z,y,x,w,v
-if(J.iS(a.oX)!==!0){J.SK(a.oX).ml(new T.Wd(a))
+if(J.iS(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
 return}this.ct(a,C.SA,0,1)
 J.U2(a.Kf)
-z=a.oX.q6(a.GR)
+z=a.Ny.q6(a.GR)
 if(z!=null){y=a.cI
-x=a.oX
+x=a.Ny
 if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.Hn(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.oX),y.W(v,1)))}}},
-static:{"^":"px,MRW,VnP",Zz:function(a){var z,y,x,w,v
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),y.W(v,1)))}}},
+static:{"^":"bN,MRW,VnP",Zz:function(a){var z,y,x,w,v
 z=R.tB([])
 y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
@@ -14802,13 +14333,13 @@
 C.oA.ZL(a)
 C.oA.XI(a)
 return a}}},
-V41:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 Wd:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0)J.vH(z)},"$1",null,2,0,null,14,"call"],
+if(J.iS(z.Ny)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
@@ -14818,10 +14349,10 @@
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gzz()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
+fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,17,54],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,17,11],
 goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -14853,7 +14384,7 @@
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":"V42;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V41;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gIs:function(a){return a.Uz},
 sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 gnN:function(a){return a.HJ},
@@ -14863,9 +14394,9 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,13,57],
-RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,20,91],
-j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,20,91],
+ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,54],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,17,84],
+j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,17,84],
 static:{TXt:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -14879,45 +14410,18 @@
 C.FH.ZL(a)
 C.FH.XI(a)
 return a}}},
-V42:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
+hi:function(a,b){var z,y,x,w,v,u,t,s
 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.Qe(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,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
+z=J.rY(y)
+switch(z.nC(y,"@")?z.yn(y,1):y){case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
 x=[]
 x.$builtinTypeInfo=[D.ta]
@@ -14941,19 +14445,14 @@
 w.$builtinTypeInfo=[P.qU]
 v=[]
 v.$builtinTypeInfo=[D.ER]
-u=D.dy
+u=D.U4
 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,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -14965,7 +14464,7 @@
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.dy
+z=D.vO
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
@@ -15028,59 +14527,61 @@
 god:function(a){var z=this.Jz
 return z.god(z)},
 gjO:function(a){return this.r0},
-gzS:function(){return this.j7},
+gzS:function(){return this.mQ},
 gPj:function(a){return this.Jz.Mq(this.r0)},
-gox:function(a){return this.kT},
+gHP:function(){return"#/"+H.d(this.gPj(this))},
+sHP:function(a){},
+gox:function(a){return this.Sa},
 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))},
 gzz:function(){return this.gt7()},
 szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.PG(this,null)
+xW:function(a){if(this.Sa)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
 if(J.xC(this.r0,""))return P.PG(this,null)
-if(this.kT&&this.gfS())return P.PG(this,null)
+if(this.Sa&&this.gfS())return P.PG(this,null)
 z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
+if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.Jt(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.Qe(x)
+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.j7=x
+this.mQ=x
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:178;a",
+"^":"Tp:165;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
-y=J.Qe(z)
+y=J.rY(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.j7))return D.hi(y.Jz,a)
+if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,177,"call"],
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
-jI:{
-"^":"Tp:69;b",
+Jt:{
+"^":"Tp:66;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-xm:{
+fz:{
 "^":"af;"},
 wv:{
 "^":"O1w;",
 gwv:function(a){return this},
 god:function(a){return},
-giR:function(){var z=this.z7
+gi2:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,144,179],
+Mq:function(a){return H.d(a)},
 gYe:function(){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -15095,8 +14596,8 @@
 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)
+Gn:function(a){var z,y,x
+z=$.Dw().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -15110,13 +14611,19 @@
 z=this.z7.t(0,a)
 if(z!=null)return P.PG(z,null)
 return this.VD(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.hV(a)
-return this.Tn(z).ml(new D.lb(this,y))}x=this.Qy.t(0,a)
-if(x!=null)return J.LE(x)
-return this.HL(a).ml(new D.aEE(this,a))},
-nJ:[function(a,b){return b},"$2","ge1",4,0,75],
+cv:function(a){var z,y,x,w,v
+z={}
+z.a=a
+y=J.uH(a,"#")
+if(0>=y.length)return H.e(y,0)
+a=y[0]
+z.a=a
+if(J.co(a,"isolates/")){x=this.Gn(z.a)
+w=this.hV(z.a)
+return this.Tn(x).ml(new D.lb(this,w))}v=this.Qy.t(0,z.a)
+if(v!=null)return J.LE(v)
+return this.HL(z.a).ml(new D.aEE(z,this))},
+nJ:[function(a,b){return b},"$2","ge1",4,0,69],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.Cf(this.ge1())
@@ -15131,7 +14638,7 @@
 HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -15162,35 +14669,35 @@
 this.eC(R.tB(z))},
 $iswv:true},
 O1w:{
-"^":"xm+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,123,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 lb:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;b,c",
 $1:[function(a){var z
-if(a==null)return this.a
-z=this.b
+if(a==null)return this.b
+z=this.c
 if(z==null)return J.LE(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+else return a.cv(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
 aEE:{
-"^":"Tp:178;c,d",
+"^":"Tp:165;a,d",
 $1:[function(a){var z,y
-z=this.c
+z=this.d
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,177,"call"],
+if(y.gUm())z.Qy.to(this.a.a,new D.zK(y))
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
 zK:{
-"^":"Tp:69;e",
+"^":"Tp:66;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
@@ -15198,39 +14705,39 @@
 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,126,"call"],
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 tm:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 mR:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 bp:{
-"^":"Tp:13;c",
+"^":"Tp:10;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,85,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 hc:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Hq:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
 "^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
+T1:function(a){var z,y,x,w,v
 z=this.XE
-H.Lm(z,0,a)
+H.aB(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
@@ -15258,7 +14765,7 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,yP,hD,RP",
+"^":"a;af<,Fw<,h7,yP,hD,RP",
 gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
 this.h7=a
@@ -15267,7 +14774,7 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.RP=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.Fw,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
@@ -15278,7 +14785,7 @@
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.eK(y)
+z.T1(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
@@ -15286,22 +14793,24 @@
 u=new D.ER(a,H.VM(z,[P.KN]),0)
 u.y8(y,this.yP.XE)
 this.yP.Vy(0,y)
-z=this.lI
+z=this.Fw
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
+if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,h0,AI,v9,tW,zb,px:KT@,t7:PB@,Er,SF,Dr,lP,W1,yz,Hw,vJ,mk,BC<,I5,bj,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,tW,zb,px:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,mk,BC<,FF,bj,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gwv:function(a){return this.Jz},
 god:function(a){return this},
 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)},
+gPj:function(a){return this.r0},
+gHP:function(){return"#/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.zG},
-gOj:function(){return this.XV},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,144,179],
+gwg:function(){return this.XV},
+Mq:function(a){return H.d(this.r0)+"/"+H.d(a)},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,166,167],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -15317,25 +14826,9 @@
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").EX(w,b,x)}},
-lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,180],
-cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,181,182],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gxY())},
-dG:[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.hz(z,!1)},"$1","geL",2,0,183,184],
-OV:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.h0=F.Wi(this,C.as,this.h0,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gzz(),"Object")&&J.xC(x.gi2(),!1)){w=this.h0
-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.h0=x}}return P.PG(this.h0,null)},"$1","gxY",2,0,185,186],
+J.UQ(w,"code").eL(w,b,x)}},
+lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,168],
+cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,169,170],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -15347,8 +14840,7 @@
 return x},
 cv:function(a){var z=this.Qy.t(0,a)
 if(z!=null)return J.LE(z)
-return this.Jz.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.h0},
+return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
 gvU:function(){return this.tW},
@@ -15358,11 +14850,11 @@
 gzz:function(){return this.PB},
 szz:function(a){this.PB=F.Wi(this,C.Tc,this.PB,a)},
 geH:function(){return this.Er},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gCi:function(){return this.lP},
 guq:function(){return this.W1},
-gxs:function(){return this.yz},
+gxs:function(){return this.p2},
 gQB:function(){return this.Hw},
 gkc:function(a){return this.mk},
 skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
@@ -15375,14 +14867,14 @@
 y=z.t(b,"name")
 this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 this.zG=F.Wi(this,C.DY,this.zG,!1)
 D.tg(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
 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.cL=F.Wi(this,C.tP,this.cL,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)
@@ -15423,7 +14915,7 @@
 y=J.UQ(z.t(b,"heap"),"usedOld")
 this.W1=F.Wi(this,C.ap,this.W1,y)
 y=J.UQ(z.t(b,"heap"),"capacityNew")
-this.yz=F.Wi(this,C.So,this.yz,y)
+this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
 this.Hw=F.Wi(this,C.eH,this.Hw,y)
 p=z.t(b,"features")
@@ -15443,32 +14935,32 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
 y.XP(y,new D.hU())},
-m7:function(){return this.Jz.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-uY:function(a,b){this.I5=0
+m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+uY: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.I5
+y=this.FF
 if(typeof y!=="number")return y.g()
-this.I5=y+1
+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.I5
+z=this.FF
 if(typeof z!=="number")return z.g()
-this.I5=z+1
+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.I5
+t=this.FF
 if(typeof t!=="number")return t.g()
-this.I5=t+1
+this.FF=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
@@ -15481,10 +14973,10 @@
 $isbv:true,
 static:{"^":"ZW"}},
 uz4:{
-"^":"xm+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 Mn:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
@@ -15495,47 +14987,47 @@
 a.Oo.V1(0)}},
 $isEH:true},
 Yb:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,187,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,171,"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:178;a,b",
+"^":"Tp:165;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.hi(z,a)
 if(y.gUm())z.Qy.to(this.b,new D.Ng(y))
-return y},"$1",null,2,0,null,177,"call"],
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
 Ng:{
-"^":"Tp:69;c",
+"^":"Tp:66;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,188,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,172,"call"],
 $isEH:true},
 hU:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
 $isEH:true},
 AP:{
-"^":"Tp:178;a",
+"^":"Tp:165;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,138,"call"],
+return y},"$1",null,2,0,null,127,"call"],
 $isEH:true},
 vO:{
-"^":"af;Ce,Jz,r0,j7,kT,px,t7,VR,AP,fn",
-gUm:function(){return(J.xC(this.j7,"Class")||J.xC(this.j7,"Function")||J.xC(this.j7,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;Ce,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
 gfS:function(){return!1},
 bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
-this.kT=!c
+this.Sa=!c
 z=this.Ce
 z.V1(0)
 z.FV(0,b)
@@ -15561,13 +15053,13 @@
 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,109],
+return z.HC(z)},"$0","gDx",0,0,96],
 nq:function(a,b){var z=this.Ce
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
-k0:[function(a){return},"$0","gcm",0,0,18],
+k0:[function(a){return},"$0","gcm",0,0,15],
 NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
+return},"$0","gym",0,0,15],
 gqh:function(a){var z=this.Ce
 return z.gqh(z)},
 gnz:function(a){var z,y
@@ -15583,7 +15075,7 @@
 $isd3:true,
 static:{"^":"RQ"}},
 ft:{
-"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
@@ -15608,12 +15100,12 @@
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"wVq;I0,LD,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"wVq;I0,LD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -15628,11 +15120,12 @@
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
+sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15650,7 +15143,7 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gO3:function(a){return this.dj},
 gUm:function(){return!0},
 gfS:function(){return!1},
@@ -15670,7 +15163,7 @@
 y=z.t(b,"name")
 this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=this.Bm
@@ -15692,76 +15185,11 @@
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,mk,ks>,S5<,tJ<,mu<,p2<,AP,fn,Jz,r0,j7,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.mk},
-skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
-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
-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.Jz
-D.tg(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)
-z=z.t(b,"error")
-this.mk=F.Wi(this,C.yh,this.mk,z)},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
 c2:{
 "^":"a;Rd<,a4>",
 $isc2:true},
 vx:{
-"^":"Zqa;Gd>,u9<,I0,l9,nE,mB,A1,y6,FB,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"V4b;Gd>,u9<,I0,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 ghY:function(){return this.l9},
@@ -15769,11 +15197,11 @@
 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.l9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
+gSK:function(){return this.lx},
+sSK:function(a){var z=this.lx
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
+this.nq(this,z)}this.lx=a},
 gUm:function(){return!0},
 gfS:function(){return!0},
 rK:function(a){var z,y
@@ -15796,14 +15224,14 @@
 this.px=this.ct(this,C.YS,this.px,w)
 w=this.A1
 this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
+this.ip(z.t(b,"source"))
 this.PT(z.t(b,"tokenPosTable"))},
 PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
 this.y6=P.Fl(null,null)
 this.FB=P.Fl(null,null)
 this.l9=F.Wi(this,C.Gd,this.l9,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
+this.lx=F.Wi(this,C.kA,this.lx,null)
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,0)
@@ -15817,22 +15245,22 @@
 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.l9=t
-u=this.nE
+u=this.lx
 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.l9:t
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.l9:t
 r=this.l9
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
 r.$builtinTypeInfo=[null]
 this.nq(this,r)}this.l9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
+u=J.J5(this.lx,t)?this.lx:t
+r=this.lx
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
+this.nq(this,r)}this.lx=u}this.y6.u(0,t,w)
 this.FB.u(0,t,s)
 v+=2}}},
-vW:function(a){var z,y,x,w
+SC:function(a){var z,y,x,w
 z=J.U6(a)
 y=this.u9
 x=0
@@ -15841,26 +15269,26 @@
 if(!(x<w))break
 y.u(0,z.t(a,x),z.t(a,x+1))
 x+=2}},
-W8:function(a){var z,y,x,w
-this.kT=!1
+ip:function(a){var z,y,x,w
+this.Sa=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.Sa=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
 for(x=0;x<z.length;x=w){w=x+1
 y.h(0,new D.c2(w,z[x]))}},
 $isvx:true},
-Zqa:{
+V4b:{
 "^":"af+Pi;",
 $isd3:true},
 uA:{
 "^":"a;Yu<,Du<,fF<",
 $isuA:true},
 HJ:{
-"^":"Pi;Yu<,Ix,VF<,KO,fY>,ar,MT,AP,fn",
+"^":"Pi;Yu<,Ix,VF<,YnP,fY>,ar,MT,AP,fn",
 gIs:function(a){return this.ar},
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gP3:function(){return this.MT},
@@ -15868,7 +15296,7 @@
 z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,189],
+return y.bu(z)},"$0","gkA",0,0,173],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -15888,18 +15316,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,189],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,173],
 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,190,71],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,174,68],
 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,190,71],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,174,68],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15930,7 +15358,7 @@
 static:{"^":"Oci,pg,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Collected"))return C.wV
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
@@ -15942,7 +15370,7 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $ist9:true},
 kx:{
-"^":"D3i;I0,xM,Du<,fF<,ub,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 glt:function(){return this.xM},
@@ -15959,7 +15387,7 @@
 gfS:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,191,192],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,175,176],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -15979,7 +15407,7 @@
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.ta(c[w],v))
 y+=2}H.rd(a,new D.fx())},
-EX:function(a,b,c){var z,y
+eL:function(a,b,c){var z,y
 this.xM=F.Wi(this,C.Kj,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
@@ -16000,7 +15428,7 @@
 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.ub=H.BU(z.t(b,"start"),16,null)
+this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.Jz
 x=y.god(y).Qn(z.t(b,"function"))
@@ -16012,7 +15440,7 @@
 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)
+this.Sa=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
 gUa:function(){return this.TD},
@@ -16056,24 +15484,24 @@
 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.ub)
+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:{
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.guL())},"$1",null,2,0,null,193,"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 fx:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 l8R:{
@@ -16087,7 +15515,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"Pqb;V8@,je,mU,I0,vud,DB,XK,FH,L7,Wu,tO,p8,FF,Wm,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"D3i;V8@,je,mU,I0,vud,DB,XK,vO,L7,zw,tO,HO,kJ,EC,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -16095,13 +15523,13 @@
 gyv:function(a){return this.vud},
 gm8:function(){return this.DB},
 gaU:function(){return this.XK},
-gaP:function(){return this.FH},
+gaP:function(){return this.vO},
 gzM:function(){return this.L7},
-gkE:function(){return this.Wu},
+gkE:function(){return this.zw},
 giP:function(){return this.tO},
-gLw:function(){return this.p8},
-gNS:function(){return this.FF},
-guh:function(){return this.Wm},
+gLw:function(){return this.HO},
+gNS:function(){return this.kJ},
+guh:function(){return this.EC},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
@@ -16111,7 +15539,7 @@
 y=D.Fs(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=z.t(b,"readClosed")
@@ -16119,7 +15547,7 @@
 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)
+this.vO=F.Wi(this,C.To,this.vO,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -16127,19 +15555,19 @@
 y=z.t(b,"localAddress")
 this.tO=F.Wi(this,C.Lx,this.tO,y)
 y=z.t(b,"localPort")
-this.p8=F.Wi(this,C.M3,this.p8,y)
+this.HO=F.Wi(this,C.M3,this.HO,y)
 y=z.t(b,"remoteAddress")
-this.FF=F.Wi(this,C.yL,this.FF,y)
+this.kJ=F.Wi(this,C.yL,this.kJ,y)
 y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
+this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
+this.zw=F.Wi(this,C.R3,this.zw,y)
 this.V8=z.t(b,"owner")}},
-Pqb:{
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -16149,9 +15577,9 @@
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zM:{
-"^":"V43;S4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
+"^":"V42;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.xT},
+skc:function(a,b){a.xT=this.ct(a,C.yh,a.xT,b)},
 static:{cE:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16164,12 +15592,12 @@
 C.SX.ZL(a)
 C.SX.XI(a)
 return a}}},
-V43:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 Rk:{
-"^":"V44;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V43;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{dP:function(a){var z,y,x,w
@@ -16184,33 +15612,73 @@
 C.ZJ.ZL(a)
 C.ZJ.XI(a)
 return a}}},
-V44:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.RY(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())},
-SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:195;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,194,"call"],
+KM:{
+"^":"wv;S3,yb,xV,DA,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+H4:[function(a){var z,y,x,w,v
+z=C.xr.kV(J.Qd(a))
+y=J.U6(z)
+x=y.t(z,"seq")
+w=y.t(z,"response")
+v=this.S3.Rz(0,x)
+if(v==null)N.QM("").YX("Received unexpected message: "+H.d(z))
+else J.KD(v,w)},"$1","gqF",2,0,178,78],
+z6:function(a,b){var z=this.DA
+if(z==null)return P.PG(C.xr.KP(P.EF(["type","ServiceException","id","","response","","kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null)),null)
+return z.ml(new U.N5(this,b))},
+ru:function(){var z,y,x
+this.xV="ws://"+H.d(window.location.host)+"/ws"
+z=W.lf
+y=H.VM(new P.Zf(P.Dt(z)),[z])
+this.DA=y.MM
+x=W.pS(this.xV,null)
+z=H.VM(new W.RO(x,C.Mp.Ph,!1),[null])
+z.geK(z).ml(new U.Lu(this,y,x))
+z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
+z.geK(z).ml(new U.VO(this))},
+static:{bU:function(){var z=new U.KM(P.L5(null,null,null,P.KN,P.oh),0,null,null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z.md()
+z.ru()
+return z}}},
+Lu:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){var z,y,x
+z=this.c
+y=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
+x=this.a
+H.VM(new W.fd(0,y.bi,y.Ph,W.aF(x.gqF()),y.Sg),[H.Kp(y,0)]).Zz()
+y=H.VM(new W.RO(z,C.d6.Ph,!1),[null])
+y.geK(y).ml(new U.jI(x))
+y=this.b.MM
+if(y.Gv!==0)H.vh(P.w("Future already completed"))
+y.OH(z)},"$1",null,2,0,null,11,"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"],
+jI:{
+"^":"Tp:10;d",
+$1:[function(a){this.d.DA=null},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+VO:{
+"^":"Tp:10;e",
+$1:[function(a){this.e.DA=null},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+N5:{
+"^":"Tp:10;a,b",
+$1:[function(a){var z,y,x,w,v
+z=this.a
+y=z.yb++
+x=this.b
+if(!J.RY(x,"/profile/tag"))N.QM("").To("Fetching "+H.d(x)+" from "+H.d(z.xV))
+w=P.qU
+v=H.VM(new P.Zf(P.Dt(w)),[w])
+z.S3.u(0,y,v)
+J.m9(a,C.xr.KP(P.EF(["seq",y,"request",x],null,null)))
+return v.MM},"$1",null,2,0,null,179,"call"],
 $isEH:true},
 bl:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -16220,7 +15688,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
+J.KD(v,w)},"$1","gVx",2,0,17,180],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -16236,7 +15704,7 @@
 N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 Ti:{
-"^":"V45;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V44;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 Xq:function(a){var z
@@ -16250,7 +15718,7 @@
 J.o0(z,a.Ll)
 return z
 case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
+J.fH(z,a.Ll)
 return z
 case"Error":z=W.r3("error-view",null)
 J.Qr(z,a.Ll)
@@ -16325,7 +15793,7 @@
 J.yO(z,a.Ll)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.rY(z,a.Ll)
+J.tQ(z,a.Ll)
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
@@ -16338,8 +15806,7 @@
 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,
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,54],
 static:{lv:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16352,7 +15819,7 @@
 C.Ns.ZL(a)
 C.Ns.XI(a)
 return a}}},
-V45:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
@@ -16365,12 +15832,10 @@
 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],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,54],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
+return z.gHP()},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gzz()},
@@ -16403,8 +15868,8 @@
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,100,1,196,95],
+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,88,1,181,90],
 static:{Al:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16418,15 +15883,15 @@
 C.Yo.XI(a)
 return a}}},
 KAf:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;c1,BH,Mg,QR,ER,Ja,MR,tu",
+"^":"a;wq,BH,Mg,QR,ER,Ja,MR,tu",
 WO:function(a,b){return this.tu.$1(b)},
 bu:function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.c1?"fields ":"")
+z.KF(this.wq?"fields ":"")
 z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
@@ -16437,7 +15902,7 @@
 return z.vM}},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gHO:function(){return this.fY===C.nU},
+gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.it},
 giO:function(a){var z=this.oc
@@ -16481,24 +15946,24 @@
 if(u)return!0}}return!1},
 OS:function(a){var z,y
 z=H.G3()
-y=H.fH(z).BD(a)
+y=H.KT(z).BD(a)
 if(y)return 0
-y=H.fH(z,[z]).BD(a)
+y=H.KT(z,[z]).BD(a)
 if(y)return 1
-y=H.fH(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).BD(a)
 if(y)return 2
-z=H.fH(z,[z,z,z]).BD(a)
+z=H.KT(z,[z,z,z]).BD(a)
 if(z)return 3
 return 4},
 Zpg:function(a){var z,y
 z=H.G3()
-y=H.fH(z,[z,z,z]).BD(a)
+y=H.KT(z,[z,z,z]).BD(a)
 if(y)return 3
-y=H.fH(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).BD(a)
 if(y)return 2
-y=H.fH(z,[z]).BD(a)
+y=H.KT(z,[z]).BD(a)
 if(y)return 1
-z=H.fH(z).BD(a)
+z=H.KT(z).BD(a)
 if(z)return 0
 return-1},
 W4:function(a,b,c){var z,y,x,w,v
@@ -16514,7 +15979,7 @@
 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;LH,QD,lk,BJ,fu,af<,yQ"},
+"^":"a;LH,QD,lk,of,fu,af<,yQ"},
 LT:{
 "^":"a;eA,vk,X9",
 jD:function(a,b){var z=this.eA.t(0,b)
@@ -16561,7 +16026,7 @@
 if(y==null){if(this.ad)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.WF.t(0,b)
 if(x==null){if(!this.ad)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gHO())continue
+if(!c.wq&&v.gZI())continue
 if(!c.BH&&v.gUd())continue
 if(c.ER&&J.ql(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
@@ -16582,7 +16047,7 @@
 z.Ut(a)
 return z}}},
 Fi:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.I1.u(0,b,a)},
 $isEH:true},
 tk:{
@@ -16591,7 +16056,7 @@
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":"V46;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V45;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 static:{qa:function(a){var z,y,x,w
@@ -16606,16 +16071,16 @@
 C.dX.ZL(a)
 C.dX.XI(a)
 return a}}},
-V46:{
+V45:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uw:{
-"^":"V47;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V46;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,20,91],
-static:{HI:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,17,84],
+static:{lt:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -16627,7 +16092,7 @@
 C.wB.ZL(a)
 C.wB.XI(a)
 return a}}},
-V47:{
+V46:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -16640,10 +16105,10 @@
 z.MW.setAttribute(b,y)}},
 iX:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
+if(z==null)z=new M.XI([],null,null)
 for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(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},
@@ -16659,7 +16124,7 @@
 else{y=$.rf()
 y.toString
 x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+w=x==null?null:H.of(x,y.Qz())
 if(w==null)break
 a=w}}y=J.x(a)
 if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
@@ -16672,8 +16137,8 @@
 pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isHF){y=S.iw(a.textContent,M.H4("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
+if(!!z.$isUn){y=S.iw(a.textContent,M.H4("text",a,b))
+if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
 return S.iw(z,M.H4(b,a,c))},
@@ -16681,7 +16146,7 @@
 z={}
 z.a=null
 y=M.RI(a)
-new W.E9(a).aN(0,new M.Jy(z,a,b,y))
+new W.E9(a).aN(0,new M.NW(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
@@ -16695,7 +16160,7 @@
 v.wA=u
 if(z!=null&&x==null&&u==null)v.DK=S.iw("{{}}",M.H4("bind",a,b))
 return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
+return z==null?null:new M.XI(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)
@@ -16723,8 +16188,8 @@
 $.ps=w+1
 y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gcK(),null,null,null)}x=$.ps
 $.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.PV=[]
+y=new L.NV(null,[],x,null,null,null)
+y.Wf=[]
 x=J.U6(b)
 v=0
 while(!0){w=x.gB(b)
@@ -16734,9 +16199,9 @@
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gQ8())
-w=y.Bg
+else{if(y.GX!=null||y.TV==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gjM())
+w=y.TV
 w.push(C.dV)
 w.push(t)}break c$0}s=b.Pn(v)
 if(u===!0)y.ti(s.Tl(d))
@@ -16758,7 +16223,7 @@
 z=$.cm()
 z.toString
 y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isJK)x=new M.ee(a,null,null)
@@ -16767,7 +16232,7 @@
 else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isHF?new M.XT(a,null,null):new M.vy(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
 RI:function(a){var z=J.x(a)
@@ -16808,14 +16273,14 @@
 t=null}}else{u=null
 t=null}y.sP(z,a==null?"":H.d(a))
 if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
-J.Fc(t.gvt(),y)}},"$1","ge2",2,0,20,58]},
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,55]},
 WF:{
-"^":"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"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,62,"call"],
 $isEH:true},
 b2:{
 "^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,20,58],
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,55],
 Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.Fc(this.vt,z)
@@ -16829,7 +16294,7 @@
 if(v!=null)J.Fc(v,!1)}break
 case"selectedIndex":z=J.Lr(this.rF)
 J.Fc(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
+break}O.wR()},"$1","gCL",2,0,17,1],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.Fc(this.vt,b)
@@ -16860,7 +16325,7 @@
 return x.ev(x,new M.qx(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 YJG:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -16874,18 +16339,18 @@
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gtH(x)},
+return x.length===1?C.U3:C.Nm.geK(x)},
 $isEH:true},
 pp:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){this.a.push(C.nI)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 ik:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 iA:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -16897,12 +16362,12 @@
 return z},
 $isEH:true},
 qx:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 LG:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return 0},
 $isEH:true},
 ee:{
@@ -16922,7 +16387,7 @@
 M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}},
-PW:{
+XI:{
 "^":"a;Cd>,ks>,jb>",
 ghK:function(){return!1},
 QE:function(a){var z=this.ks
@@ -16930,7 +16395,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,DK,wA,Cd,ks,jb",
+"^":"XI;qd,DK,wA,Cd,ks,jb",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
@@ -16953,7 +16418,7 @@
 this.u2=z}return z},
 gPP:function(){return!!J.x(this.grF()).$isvy?this.grF():this},
 $isvy:true},
-DH:{
+bX:{
 "^":"a;ku,EA,Po"},
 ug:{
 "^":"V2;rF,u2,Vw",
@@ -16979,7 +16444,7 @@
 gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
 oq:function(a){var z,y
 z=this.os
-if(z!=null)z.xT()
+if(z!=null)z.NC()
 if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
 if(z!=null){z.S6(0)
 this.os=null
@@ -17004,7 +16469,7 @@
 z.u(0,w,v)}this.AD=v
 z=v}u=J.O2(z)
 $.rf().u(0,u,this.rF)
-t=new M.DH(a,null,null)
+t=new M.bX(a,null,null)
 for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.QE(r):null
 M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
 t.Po=u.lastChild
@@ -17066,7 +16531,7 @@
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,YO,vU",TA:function(a){var z,y,x,w
+static:{"^":"mn,EW,Qn,vU",TA:function(a){var z,y,x,w
 z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
@@ -17091,27 +16556,27 @@
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
 z=new M.CE()
-y=J.MK(a,$.Ze())
+y=J.MK(a,$.i8())
 if(M.RI(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.i8())+" { display: none; }")
 document.head.appendChild(z)}}},
 CE:{
-"^":"Tp:20;",
+"^":"Tp:17;",
 $1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
 W6o:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,168,"call"],
+"^":"Tp:10;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 aR:{
-"^":"Tp:13;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:function(a){return this.c.pm(a,this.a,this.b)},
 $isEH:true},
-Jy:{
-"^":"Tp:75;a,b,c,d",
+NW:{
+"^":"Tp:69;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")
@@ -17131,7 +16596,7 @@
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.bn},
-xT:function(){var z,y
+NC:function(){var z,y
 z=this.WI
 y=J.x(z)
 if(!!y.$isAp){y.S6(z)
@@ -17140,7 +16605,7 @@
 if(!!y.$isAp){y.S6(z)
 this.bn=null}},
 dE:function(a,b){var z,y,x
-this.xT()
+this.NC()
 z=this.YS.rF
 y=a.qd
 x=y!=null
@@ -17164,7 +16629,7 @@
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.bn
 if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,20,14],
+y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,17,11],
 Io:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
@@ -17176,7 +16641,7 @@
 this.VC=a.gRT().yI(this.gk8())}y=this.lS
 y=y!=null?y:[]
 this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
-BK:function(a){var z,y,x,w
+Ih:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.YS.rF
 y=this.SU
@@ -17188,10 +16653,10 @@
 if(z)return x
 w=M.Ky(x).gos()
 if(w==null)return x
-return w.BK(C.jn.cU(w.SU.length,2)-1)},
+return w.Ih(C.jn.cU(w.SU.length,2)-1)},
 uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.BK(z.W(a,1))
+y=this.Ih(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
 else w=c!=null&&J.yx(c)?J.MQ(c):null
@@ -17206,8 +16671,8 @@
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.BK(y.W(a,1))
-w=this.BK(a)
+x=this.Ih(y.W(a,1))
+w=this.Ih(a)
 v=this.SU
 u=J.ew(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
@@ -17241,8 +16706,8 @@
 x=null
 h=p.Rz(0,y)
 w=null
-if(h!=null&&J.yx(J.fz(h))){w=h.gWf()
-g=J.fz(h)}else{try{w=[]
+if(h!=null&&J.yx(J.Bq(h))){w=h.gpp()
+g=J.Bq(h)}else{try{w=[]
 if(this.eY!=null)y=this.RV(y)
 if(y!=null)x=t.dI(y,z,w)}catch(f){k=H.Ru(f)
 v=k
@@ -17253,7 +16718,7 @@
 j=v
 if(j==null)H.vh(P.u("Error must not be null"))
 if(k.Gv!==0)H.vh(P.w("Future already completed"))
-k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,197,198],
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gpp())},"$1","gk8",2,0,182,183],
 Ep:function(a){var z
 for(z=J.mY(a);z.G();)J.x0(z.gl())},
 Ke:function(){var z=this.VC
@@ -17265,11 +16730,11 @@
 this.Ke()
 for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-this.xT()
+this.NC()
 this.YS.os=null
 this.Jh=!0}},
 wS:{
-"^":"a;yT>,Wf<",
+"^":"a;UN>,pp<",
 $iswS:true},
 XT:{
 "^":"vy;rF,u2,Vw",
@@ -17278,12 +16743,12 @@
 if(d){z=c==null?"":H.d(c)
 J.t3(this.rF,z)
 return}this.Mh(0,b)
-z=this.gMm()
+z=this.gmt()
 z.$1(J.mu(c,z))
 this.gCd(this).u(0,b,c)
 return c},
 ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gMm",2,0,13,21]},
+J.t3(this.rF,z)},"$1","gmt",2,0,10,18]},
 VT:{
 "^":"V2;rF,u2,Vw",
 grF:function(){return this.rF},
@@ -17340,7 +16805,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gzf",2,0,199,21],
+return y+H.d(z[w])},"$1","gzf",2,0,184,18],
 cH:[function(a){var z,y,x,w,v,u,t,s
 z=this.jU
 if(0>=z.length)return H.e(z,0)
@@ -17351,7 +16816,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,200,201],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,185,186],
 l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
 static:{"^":"rz5,jO,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -17382,7 +16847,7 @@
 "^":"",
 I5:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{vC:function(a){var z,y,x,w
+static:{cF:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -17397,12 +16862,12 @@
 return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 el:{
-"^":"V48;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V47;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,17,84],
 static:{oH:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -17415,7 +16880,7 @@
 C.bV.ZL(a)
 C.bV.XI(a)
 return a}}},
-V48:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -17432,7 +16897,7 @@
 W.KV.$isa=true
 W.my.$isa=true
 W.yg.$isa=true
-W.M5.$isa=true
+W.QI.$isa=true
 P.qU.$isqU=true
 P.qU.$isRz=true
 P.qU.$asRz=[P.qU]
@@ -17447,10 +16912,10 @@
 P.a6.$isRz=true
 P.a6.$asRz=[P.a6]
 P.a6.$isa=true
+P.qv.$isa=true
 P.WO.$isWO=true
 P.WO.$isQV=true
 P.WO.$isa=true
-P.oz.$isa=true
 W.h4.$ish4=true
 W.h4.$isKV=true
 W.h4.$isa=true
@@ -17465,12 +16930,12 @@
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.X7S.$ishw=true
-U.X7S.$isa=true
+U.ma.$ishw=true
+U.ma.$isa=true
 U.HB.$ishw=true
 U.HB.$isa=true
-U.Mp.$ishw=true
-U.Mp.$isa=true
+U.zb.$ishw=true
+U.zb.$isa=true
 U.x9.$ishw=true
 U.x9.$isa=true
 U.no.$ishw=true
@@ -17481,12 +16946,12 @@
 U.elO.$isa=true
 U.c0.$ishw=true
 U.c0.$isa=true
-U.nu.$ishw=true
-U.nu.$isa=true
+U.ae.$ishw=true
+U.ae.$isa=true
 U.Qb.$ishw=true
 U.Qb.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
+P.IN.$isIN=true
+P.IN.$isa=true
 P.uq.$isa=true
 N.Rw.$isa=true
 T.yj.$isyj=true
@@ -17512,33 +16977,25 @@
 P.cb.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
+W.Oq.$isOq=true
+W.Oq.$isea=true
+W.Oq.$isa=true
 A.dM.$ish4=true
 A.dM.$isKV=true
 A.dM.$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.dg.$isdg=true
-W.dg.$isea=true
-W.dg.$isa=true
+W.lf.$isa=true
+W.AW.$isAW=true
+W.AW.$isea=true
+W.AW.$isa=true
+W.K3.$isea=true
+W.K3.$isa=true
 D.ta.$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
@@ -17546,19 +17003,20 @@
 D.vx.$isvx=true
 D.vx.$isaf=true
 D.vx.$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.c2.$isc2=true
 D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kQ.$isea=true
-W.kQ.$isa=true
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
 D.HJ.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
 N.HV.$isHV=true
 N.HV.$isa=true
 H.yo.$isa=true
@@ -17610,10 +17068,10 @@
 P.iP.$isRz=true
 P.iP.$asRz=[null]
 P.iP.$isa=true
-L.AR.$isAR=true
-L.AR.$isa=true
 O.Hz.$isHz=true
 O.Hz.$isa=true
+L.AR.$isAR=true
+L.AR.$isa=true
 D.N7.$isN7=true
 D.N7.$isaf=true
 D.N7.$isa=true
@@ -17625,10 +17083,6 @@
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
-J.Qe=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.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -17643,12 +17097,16 @@
 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.Xh.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.ht.prototype
 if(typeof a=="boolean")return J.yEe.prototype
@@ -17672,6 +17130,7 @@
 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.Bq=function(a){return J.RE(a).gUN(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
@@ -17687,24 +17146,23 @@
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Du=function(a){return J.RE(a).gxN(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Er=function(a,b){return J.RE(a).sfY(a,b)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.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.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.FW=function(a,b){return J.Qe(a).j(a,b)}
+J.FW=function(a,b){return J.rY(a).j(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.GF=function(a,b){return J.RE(a).spM(a,b)}
 J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
 J.Gc=function(a){return J.RE(a).gnv(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
+J.HF=function(a){return J.RE(a).gD7(a)}
 J.HO=function(a){return J.RE(a).gWw(a)}
 J.Hf=function(a){return J.RE(a).gd0(a)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
@@ -17712,14 +17170,14 @@
 J.Hr=function(a){return J.RE(a).gL0(a)}
 J.I1=function(a){return J.RE(a).gSf(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Im=function(a){return J.RE(a).gSk(a)}
 J.Ip=function(a,b){return J.RE(a).QS(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
-J.JA=function(a,b,c){return J.Qe(a).h8(a,b,c)}
+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.JZ=function(a,b){return J.RE(a).st0(a,b)}
@@ -17736,7 +17194,6 @@
 J.Kn=function(a){return J.Wx(a).yu(a)}
 J.Kt=function(a){return J.RE(a).gG3(a)}
 J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.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)}
@@ -17750,7 +17207,6 @@
 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.M2=function(a,b){return J.w1(a).ev(a,b)}
 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)}
@@ -17764,11 +17220,10 @@
 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.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
-J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
+J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.Nl=function(a){return J.RE(a).gO3(a)}
 J.O2=function(a){return J.RE(a).JP(a)}
 J.O6=function(a){return J.RE(a).goc(a)}
@@ -17778,7 +17233,6 @@
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.Oo=function(a,b){return J.RE(a).sjT(a,b)}
-J.Oq=function(a){return J.RE(a).gWc(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
 J.P5=function(a){return J.RE(a).gHo(a)}
 J.PB=function(a){return J.RE(a).gI(a)}
@@ -17805,9 +17259,11 @@
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.RY=function(a,b){return J.Qe(a).Tc(a,b)}
+J.RY=function(a,b){return J.rY(a).Tc(a,b)}
 J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
+J.S2=function(a,b){return J.RE(a).jn(a,b)}
+J.S5=function(a,b){return J.RE(a).sbA(a,b)}
 J.S9=function(a){return J.RE(a).gyX(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
@@ -17818,9 +17274,8 @@
 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.Sq=function(a,b){return J.RE(a).Ft(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.Td=function(a){return J.RE(a).gpf(a)}
 J.Tm=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)}
@@ -17836,6 +17291,7 @@
 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,b){return J.U6(a).u8(a,b)}
 J.VJ=function(a,b){return J.w1(a).sit(a,b)}
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
@@ -17847,12 +17303,13 @@
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.Vw=function(a,b){return J.U6(a).sB(a,b)}
 J.W2=function(a){return J.RE(a).gCf(a)}
+J.WA=function(a){return J.RE(a).gMZ(a)}
 J.WB=function(a,b){return J.RE(a).skZ(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WM=function(a){return J.RE(a).gyv(a)}
-J.WS=function(a){return J.RE(a).gD7(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WY=function(a){return J.RE(a).gnp(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
@@ -17864,14 +17321,13 @@
 J.ZL=function(a){return J.RE(a).gAF(a)}
 J.ZN=function(a){return J.RE(a).gqN(a)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
-J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
+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.aw=function(a,b){return J.RE(a).sNN(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
-J.bL=function(a){return J.RE(a).gwg(a)}
 J.ba=function(a){return J.RE(a).gKJ(a)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
@@ -17883,18 +17339,18 @@
 J.cU=function(a){return J.RE(a).gHh(a)}
 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.Qe(a).nC(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.dq=function(a){return J.RE(a).gJD(a)}
-J.eU=function(a){return J.RE(a).gRh(a)}
-J.et=function(a,b){return J.U6(a).kJ(a,b)}
+J.eU=function(a){return J.RE(a).gY9(a)}
 J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.fA=function(a){return J.RE(a).gJp(a)}
 J.fD=function(a){return J.RE(a).e6(a)}
+J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
@@ -17904,7 +17360,6 @@
 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.fz=function(a){return J.RE(a).gyT(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hb=function(a){return J.RE(a).gQ1(a)}
 J.hn=function(a){return J.RE(a).gEu(a)}
@@ -17919,7 +17374,6 @@
 J.is=function(a){return J.RE(a).gZm(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
 J.jH=function(a){return J.RE(a).ghN(a)}
 J.jP=function(a){return J.RE(a).gbA(a)}
 J.jd=function(a,b){return J.RE(a).snZ(a,b)}
@@ -17944,7 +17398,6 @@
 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.m9=function(a,b){return J.RE(a).wR(a,b)}
@@ -17961,11 +17414,12 @@
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.o0=function(a,b){return J.RE(a).sRu(a,b)}
-J.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.oL=function(a){return J.RE(a).gWT(a)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a,b){return J.RE(a).siJ(a,b)}
+J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pB=function(a){return J.RE(a).gDX(a)}
@@ -17981,15 +17435,14 @@
 J.qq=function(a,b){return J.RE(a).sNG(a,b)}
 J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
-J.rY=function(a,b){return J.RE(a).swv(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
+J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
 J.tF=function(a){return J.RE(a).gyW(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
+J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tp=function(a){return J.RE(a).gHy(a)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
 J.tx=function(a){return J.U6(a).gl0(a)}
@@ -17997,22 +17450,23 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.u9=function(a){return J.RE(a).gVU(a)}
-J.uH=function(a,b){return J.Qe(a).Fr(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){return J.RE(a).gVE(a)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uX=function(a,b){return J.RE(a).sph(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.un=function(a){return J.RE(a).giJ(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
 J.vH=function(a){return J.RE(a).Kn(a)}
 J.vI=function(a,b,c){return J.RE(a).D9(a,b,c)}
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
+J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.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)}
@@ -18033,6 +17487,7 @@
 J.xW=function(a,b){return J.RE(a).sZm(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xq=function(a,b){return J.w1(a).Vr(a,b)}
+J.xs=function(a,b){return J.Wx(a).O(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yA=function(a){return J.RE(a).gvu(a)}
@@ -18051,22 +17506,21 @@
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
 C.Gx=X.hV.prototype
-C.C8=B.G6.prototype
+C.J0=B.G6.prototype
 C.HR=A.wM.prototype
 C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
 C.ka=Z.aC.prototype
 C.tA=O.VY.prototype
 C.ux=F.Be.prototype
 C.T0=R.i6.prototype
 C.O0=R.JI.prototype
 C.OD=F.ZP.prototype
-C.zg=L.nJ.prototype
+C.Gh=L.nJ.prototype
 C.UF=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.by=A.Gk.prototype
 C.Cl=X.MJ.prototype
-C.n0=X.Nr.prototype
+C.uG=X.Nr.prototype
 C.Xo=U.DK.prototype
 C.cI=N.BS.prototype
 C.Cs=O.Vb.prototype
@@ -18079,12 +17533,12 @@
 C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.J0=E.wN.prototype
+C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.Tl=E.oF.prototype
 C.wK=E.qh.prototype
-C.rU=E.Q6.prototype
+C.to=E.Q6.prototype
 C.za=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Rr=E.uE.prototype
@@ -18098,11 +17552,11 @@
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
 C.Ji=D.Oz.prototype
-C.B2=D.St.prototype
+C.Hj=D.St.prototype
 C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.Pp.prototype
-C.jn=J.Xh.prototype
+C.jn=J.L7.prototype
 C.jN=J.ht.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
@@ -18112,15 +17566,15 @@
 C.MG=M.CX.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
-C.pl=A.ye.prototype
 C.SU=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.J7=A.Ww.prototype
 C.t5=W.BH.prototype
 C.k0=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iC.prototype
-C.Ki=A.xc.prototype
+C.Ki=A.ir.prototype
+C.Vp=Q.qZ.prototype
 C.oA=T.ov.prototype
 C.Mh=A.kn.prototype
 C.FH=U.fI.prototype
@@ -18143,8 +17597,8 @@
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.dS=new P.AH()
-C.WA=new D.WAE("Collected")
+C.v8=new P.AH()
+C.wV=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
@@ -18152,232 +17606,233 @@
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
 C.it=new A.iYn(2)
-C.YT=new H.IN("expr")
-C.eP=H.IL('dynamic')
+C.YT=new H.GD("expr")
+C.HH=H.IL('dynamic')
 C.NS=new K.vly()
-C.oiA=new A.A2()
+C.px=new A.A2()
 I.ko=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
-C.XVh=I.ko([C.NS,C.oiA])
-C.V0=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.XVh)
-C.rB=new H.IN("isolate")
-C.a2p=H.IL('bv')
-C.ZQ=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.XVh)
-C.Ms=new H.IN("iconClass")
+C.XVh=I.ko([C.NS,C.px])
+C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
+C.rB=new H.GD("isolate")
+C.Ks=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ks,!1,C.XVh)
+C.Ms=new H.GD("iconClass")
 C.Db=H.IL('qU')
-C.mI=new K.nd()
-C.X0=I.ko([C.NS,C.mI])
-C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.X0)
-C.VK=new H.IN("devtools")
+C.J19=new K.ndx()
+C.y0=I.ko([C.NS,C.J19])
+C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.y0)
+C.VK=new H.GD("devtools")
 C.BQ=H.IL('a2')
 C.m8=new A.ES(C.VK,C.BM,!1,C.BQ,!1,C.XVh)
-C.EV=new H.IN("library")
+C.EV=new H.GD("library")
 C.Jny=H.IL('U4')
 C.Ei=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.XVh)
-C.zU=new H.IN("uncheckedText")
+C.zU=new H.GD("uncheckedText")
 C.IK=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.XVh)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.IL('EH')
+C.UL=new H.GD("profileChanged")
+C.dg=H.IL('EH')
 C.xD=I.ko([])
-C.mM=new A.ES(C.UL,C.it,!1,C.yQP,!1,C.xD)
-C.Ql=new H.IN("hasClass")
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.X0)
-C.B0=new H.IN("expand")
+C.mM=new A.ES(C.UL,C.it,!1,C.dg,!1,C.xD)
+C.Ql=new H.GD("hasClass")
+C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.y0)
+C.B0=new H.GD("expand")
 C.Rf=new A.ES(C.B0,C.BM,!1,C.BQ,!1,C.XVh)
-C.kV=new H.IN("link")
+C.kV=new H.GD("link")
 C.Os=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.XVh)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.it,!1,C.yQP,!1,C.xD)
-C.SA=new H.IN("lines")
+C.Wm=new H.GD("refChanged")
+C.QW=new A.ES(C.Wm,C.it,!1,C.dg,!1,C.xD)
+C.SA=new H.GD("lines")
 C.hAX=H.IL('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.bJ=new H.IN("counters")
+C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.y0)
+C.bJ=new H.GD("counters")
 C.jJ=H.IL('qC')
 C.iF=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.XVh)
-C.cg=new H.IN("anchor")
+C.cg=new H.GD("anchor")
 C.pU=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.XVh)
-C.fn=new H.IN("instance")
-C.fX=H.IL('vO')
-C.cV=new A.ES(C.fn,C.BM,!1,C.fX,!1,C.XVh)
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.aH=new H.IN("displayCutoff")
-C.xY=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.uk=new H.IN("last")
+C.fn=new H.GD("instance")
+C.MR1=H.IL('vO')
+C.cV=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.XVh)
+C.aH=new H.GD("displayCutoff")
+C.hR=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.y0)
+C.uk=new H.GD("last")
 C.Mq=new A.ES(C.uk,C.BM,!1,C.BQ,!1,C.XVh)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.it,!1,C.yQP,!1,C.xD)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.it,!1,C.yQP,!1,C.xD)
-C.Mc=new H.IN("flagList")
-C.XV=new A.ES(C.Mc,C.BM,!1,C.fX,!1,C.XVh)
-C.QH=new H.IN("fragmentation")
-C.kt=new A.ES(C.QH,C.BM,!1,C.fX,!1,C.XVh)
-C.td=new H.IN("object")
+C.bz=new H.GD("isolateChanged")
+C.Bk=new A.ES(C.bz,C.it,!1,C.dg,!1,C.xD)
+C.CG=new H.GD("posChanged")
+C.Ml=new A.ES(C.CG,C.it,!1,C.dg,!1,C.xD)
+C.Mc=new H.GD("flagList")
+C.XV=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.XVh)
+C.QH=new H.GD("fragmentation")
+C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
+C.td=new H.GD("object")
 C.SmN=H.IL('af')
 C.No=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.XVh)
-C.SR=new H.IN("map")
-C.HL=new A.ES(C.SR,C.BM,!1,C.fX,!1,C.XVh)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.kw=new H.IN("trace")
-C.W9=new A.ES(C.kw,C.BM,!1,C.fX,!1,C.XVh)
-C.uu=new H.IN("internal")
+C.SR=new H.GD("map")
+C.HL=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.XVh)
+C.Gs=new H.GD("sampleCount")
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.y0)
+C.kw=new H.GD("trace")
+C.W9=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.XVh)
+C.uu=new H.GD("internal")
 C.x3=new A.ES(C.uu,C.BM,!1,C.BQ,!1,C.XVh)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.nf=new H.IN("function")
-C.Up=new A.ES(C.nf,C.BM,!1,C.fX,!1,C.XVh)
-C.Ys=new H.IN("pad")
+C.TW=new H.GD("tagSelector")
+C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.y0)
+C.nf=new H.GD("function")
+C.Up=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.XVh)
+C.Ys=new H.GD("pad")
 C.hK=new A.ES(C.Ys,C.BM,!1,C.BQ,!1,C.XVh)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!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.Gr=new H.IN("endPos")
+C.He=new H.GD("hideTagsChecked")
+C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!1,C.y0)
+C.zz=new H.GD("timeSpan")
+C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.y0)
+C.Gr=new H.GD("endPos")
 C.yw=H.IL('KN')
 C.j3=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.XVh)
-C.mr=new H.IN("expanded")
-C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.X0)
-C.xP=new H.IN("ref")
+C.mr=new H.GD("expanded")
+C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
+C.j2=new H.GD("app")
+C.jY=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.jY,!1,C.XVh)
+C.xP=new H.GD("ref")
 C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
-C.jU=new H.IN("file")
-C.v0=new A.ES(C.jU,C.BM,!1,C.fX,!1,C.XVh)
-C.qs=new H.IN("io")
-C.ly=new A.ES(C.qs,C.BM,!1,C.fX,!1,C.XVh)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.it,!1,C.yQP,!1,C.xD)
-C.i0=new H.IN("coverageChanged")
-C.GH=new A.ES(C.i0,C.it,!1,C.yQP,!1,C.xD)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.it,!1,C.yQP,!1,C.xD)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.it,!1,C.yQP,!1,C.xD)
-C.aP=new H.IN("active")
+C.jU=new H.GD("file")
+C.v0=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.XVh)
+C.qs=new H.GD("io")
+C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
+C.qX=new H.GD("fragmentationChanged")
+C.dO=new A.ES(C.qX,C.it,!1,C.dg,!1,C.xD)
+C.i0=new H.GD("coverageChanged")
+C.GH=new A.ES(C.i0,C.it,!1,C.dg,!1,C.xD)
+C.pO=new H.GD("functionChanged")
+C.au=new A.ES(C.pO,C.it,!1,C.dg,!1,C.xD)
+C.rP=new H.GD("mapChanged")
+C.Nt=new A.ES(C.rP,C.it,!1,C.dg,!1,C.xD)
+C.aP=new H.GD("active")
 C.xO=new A.ES(C.aP,C.BM,!1,C.BQ,!1,C.XVh)
-C.WQ=new H.IN("field")
-C.NA=new A.ES(C.WQ,C.BM,!1,C.fX,!1,C.XVh)
-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.WQ=new H.GD("field")
+C.NA=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.XVh)
+C.YD=new H.GD("sampleRate")
+C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
+C.Aa=new H.GD("results")
 C.Gu=H.IL('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.X0)
-C.t6=new H.IN("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.hf=new H.IN("label")
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.y0)
+C.t6=new H.GD("mapAsString")
+C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
+C.hf=new H.GD("label")
 C.n6=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.XVh)
-C.XA=new H.IN("cls")
-C.jF=H.IL('dy')
-C.by=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.XVh)
-C.UY=new H.IN("result")
+C.UY=new H.GD("result")
 C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
-C.PX=new H.IN("script")
-C.KB=H.IL('vx')
-C.Cj=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.XVh)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
+C.PX=new H.GD("script")
+C.c3=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.c3,!1,C.XVh)
+C.S4=new H.GD("busy")
+C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
+C.AO=new H.GD("qualifiedName")
 C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
-C.OO=new H.IN("flag")
+C.OO=new H.GD("flag")
 C.RM=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.XVh)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.CO=new A.ES(C.XA,C.BM,!1,C.fX,!1,C.XVh)
-C.pH=new H.IN("small")
-C.CN=new A.ES(C.pH,C.BM,!1,C.BQ,!1,C.XVh)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.kz=new H.IN("showCoverageChanged")
-C.db=new A.ES(C.kz,C.it,!1,C.yQP,!1,C.xD)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.it,!1,C.yQP,!1,C.xD)
-C.bk=new H.IN("checked")
+C.eh=new H.GD("lineMode")
+C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
+C.XA=new H.GD("cls")
+C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.fV=new H.GD("small")
+C.CN=new A.ES(C.fV,C.BM,!1,C.BQ,!1,C.XVh)
+C.AV=new H.GD("callback")
+C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
+C.PM=new H.GD("status")
+C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.y0)
+C.kz=new H.GD("showCoverageChanged")
+C.db=new A.ES(C.kz,C.it,!1,C.dg,!1,C.xD)
+C.ox=new H.GD("countersChanged")
+C.Rh=new A.ES(C.ox,C.it,!1,C.dg,!1,C.xD)
+C.bk=new H.GD("checked")
 C.Nu=new A.ES(C.bk,C.BM,!1,C.BQ,!1,C.XVh)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
+C.bE=new H.GD("sampleDepth")
+C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.y0)
+C.tW=new H.GD("pos")
 C.HM=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.XVh)
-C.RJ=new H.IN("vm")
+C.RJ=new H.GD("vm")
 C.n8S=H.IL('wv')
 C.Ce=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.XVh)
-C.WZ=new H.IN("coverage")
+C.WZ=new H.GD("coverage")
 C.Um=new A.ES(C.WZ,C.BM,!1,C.BQ,!1,C.XVh)
-C.AV=new H.IN("callback")
-C.QiO=H.IL('Sa')
-C.ti=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.XVh)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.it,!1,C.yQP,!1,C.xD)
-C.UX=new H.IN("msg")
-C.X4=new A.ES(C.UX,C.BM,!1,C.fX,!1,C.XVh)
-C.j2=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.XVh)
-C.rE=new H.IN("frame")
+C.wu=H.IL('Sa')
+C.ti=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.XVh)
+C.N8=new H.GD("scriptChanged")
+C.qE=new A.ES(C.N8,C.it,!1,C.dg,!1,C.xD)
+C.UX=new H.GD("msg")
+C.X4=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.XVh)
+C.rE=new H.GD("frame")
 C.Kv=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.XVh)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bw=new A.ES(C.xS,C.it,!1,C.yQP,!1,C.xD)
-C.kG=new H.IN("classTable")
+C.ak=new H.GD("hasParent")
+C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.y0)
+C.xS=new H.GD("tagSelectorChanged")
+C.bw=new A.ES(C.xS,C.it,!1,C.dg,!1,C.xD)
+C.kG=new H.GD("classTable")
 C.HjP=H.IL('Vz')
-C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.X0)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.i4=new H.IN("code")
+C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.y0)
+C.Dj=new H.GD("refreshTime")
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
+C.i4=new H.GD("code")
 C.nq=H.IL('kx')
 C.h9=new A.ES(C.i4,C.BM,!1,C.nq,!1,C.XVh)
-C.oj=new H.IN("httpServer")
-C.dF=new A.ES(C.oj,C.BM,!1,C.fX,!1,C.XVh)
-C.vb=new H.IN("profile")
-C.eq=new A.ES(C.vb,C.BM,!1,C.fX,!1,C.XVh)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.X0)
-C.Ve=new H.IN("socket")
+C.oj=new H.GD("httpServer")
+C.dF=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.XVh)
+C.vb=new H.GD("profile")
+C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
+C.a0=new H.GD("isDart")
+C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Ve=new H.GD("socket")
 C.Xmq=H.IL('WP')
 C.Gg=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.XVh)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.it,!1,C.yQP,!1,C.xD)
-C.ne=new H.IN("exception")
+C.Gn=new H.GD("objectChanged")
+C.az=new A.ES(C.Gn,C.it,!1,C.dg,!1,C.xD)
+C.ne=new H.GD("exception")
 C.SNu=H.IL('EP')
 C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
-C.Wj=new H.IN("process")
-C.FN=new A.ES(C.Wj,C.BM,!1,C.fX,!1,C.XVh)
-C.QK=new H.IN("qualified")
+C.Wj=new H.GD("process")
+C.FN=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.XVh)
+C.QK=new H.GD("qualified")
 C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
-C.yh=new H.IN("error")
+C.yh=new H.GD("error")
 C.k5t=H.IL('ft')
 C.yc=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.XVh)
 C.oUD=H.IL('N7')
 C.xQ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.XVh)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.it,!1,C.yQP,!1,C.xD)
-C.XY=new H.IN("showCoverage")
+C.r1=new H.GD("expandChanged")
+C.nP=new A.ES(C.r1,C.it,!1,C.dg,!1,C.xD)
+C.XY=new H.GD("showCoverage")
 C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
-C.Lc=new H.IN("kind")
+C.Lc=new H.GD("kind")
 C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
-C.YE=new H.IN("webSocket")
-C.Xt=new A.ES(C.YE,C.BM,!1,C.fX,!1,C.XVh)
-C.ngm=I.ko([C.mI])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ngm)
-C.lH=new H.IN("checkedText")
+C.YE=new H.GD("webSocket")
+C.Xt=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.XVh)
+C.ng=I.ko([C.J19])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ng)
+C.lH=new H.GD("checkedText")
 C.A5=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.XVh)
 C.GE=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.XVh)
-C.XM=new H.IN("path")
-C.hL=new A.ES(C.XM,C.BM,!1,C.fX,!1,C.XVh)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.vp=new H.IN("list")
-C.K9=new A.ES(C.vp,C.BM,!1,C.fX,!1,C.XVh)
-C.PI=new H.IN("displayValue")
-C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.X0)
+C.XM=new H.GD("path")
+C.hL=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.XVh)
+C.mi=new H.GD("text")
+C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.y0)
+C.vp=new H.GD("list")
+C.K9=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.XVh)
+C.PI=new H.GD("displayValue")
+C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.nI=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kQ])
+C.nI=H.VM(new W.FkO("click"),[W.Oq])
+C.d6=H.VM(new W.FkO("close"),[W.K3])
+C.MD=H.VM(new W.FkO("error"),[W.ea])
+C.yZ=H.VM(new W.FkO("hashchange"),[W.ea])
 C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kQ])
 C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.Hj=H.VM(new W.FkO("popstate"),[W.dg])
+C.uh=H.VM(new W.FkO("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.Oq])
+C.Mp=H.VM(new W.FkO("open"),[W.ea])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -18509,25 +17964,23 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.xr=new P.pE(null,null)
+C.xr=new P.D4(null,null)
 C.A3=new P.Cf(null)
 C.Sr=new P.ze(null,null)
 C.Ab=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
+C.t4=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.SV=new H.IN("keys")
-C.Yn=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
+C.SV=new H.GD("keys")
+C.Yn=new H.GD("values")
+C.Wn=new H.GD("length")
+C.ai=new H.GD("isEmpty")
+C.nZ=new H.GD("isNotEmpty")
 C.WK=I.ko([C.SV,C.Yn,C.Wn,C.ai,C.nZ])
 C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.IL('nd')
-C.Cd=I.ko([C.N4])
 C.G8=I.ko(["==","!=","<=",">=","||","&&"])
-C.WJ=I.ko(["in","this"])
+C.Cd=I.ko(["in","this"])
 C.QC=I.ko(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.ML=I.ko([40,41,91,93,123,125])
@@ -18541,7 +17994,7 @@
 C.V0I=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.V0I)
 C.MEG=I.ko(["enumerate"])
-C.eu=new H.Px(1,{enumerate:K.zp()},C.MEG)
+C.eu=new H.Px(1,{enumerate:K.G5()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.ko([C.uwj])
@@ -18553,160 +18006,150 @@
 C.Cn=new D.l8R("Listening")
 C.qp=new D.l8R("Normal")
 C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.US=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.Ph=new H.IN("back")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.Ka=new H.IN("call")
-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.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-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.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.Uj=new H.IN("forward")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.Uq=new H.IN("getFormattedValue")
-C.A8=new H.IN("getValue")
-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.Ge=new H.IN("hashLinkWorkaround")
-C.wq=new H.IN("hitStyle")
-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.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.h7=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.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-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.So=new H.IN("newHeapCapacity")
-C.EK=new H.IN("newHeapUsed")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.eH=new H.IN("oldHeapCapacity")
-C.ap=new H.IN("oldHeapUsed")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-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.yL=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.DW=new H.IN("sortedRows")
-C.Pf=new H.IN("stacktrace")
-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.hN=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.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.jh=new H.IN("v")
-C.zdr=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.IL('hx')
+C.IH=new H.GD("address")
+C.US=new H.GD("architecture")
+C.Zg=new H.GD("args")
+C.ET=new H.GD("assertsEnabled")
+C.WC=new H.GD("bpt")
+C.Ro=new H.GD("buttonClick")
+C.Ka=new H.GD("call")
+C.C0=new H.GD("change")
+C.eZ=new H.GD("changeSort")
+C.OI=new H.GD("classes")
+C.To=new H.GD("closing")
+C.qt=new H.GD("coloring")
+C.p1=new H.GD("columns")
+C.M8=new H.GD("currentHash")
+C.iE=new H.GD("descriptor")
+C.f4=new H.GD("descriptors")
+C.aK=new H.GD("doAction")
+C.GP=new H.GD("element")
+C.tP=new H.GD("entry")
+C.Zb=new H.GD("eval")
+C.u7=new H.GD("evalNow")
+C.Ek=new H.GD("expander")
+C.Pn=new H.GD("expanderStyle")
+C.R3=new H.GD("fd")
+C.Gd=new H.GD("firstTokenPos")
+C.FP=new H.GD("formatSize")
+C.kF=new H.GD("formatTime")
+C.UD=new H.GD("formattedAddress")
+C.Aq=new H.GD("formattedAverage")
+C.DS=new H.GD("formattedCollections")
+C.C9=new H.GD("formattedDeoptId")
+C.VF=new H.GD("formattedExclusive")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.YJ=new H.GD("formattedInclusive")
+C.eF=new H.GD("formattedInclusiveTicks")
+C.oI=new H.GD("formattedLine")
+C.ST=new H.GD("formattedTotalCollectionTime")
+C.EI=new H.GD("functions")
+C.JB=new H.GD("getColumnLabel")
+C.Uq=new H.GD("getFormattedValue")
+C.A8=new H.GD("getValue")
+C.SI=new H.GD("hasDescriptors")
+C.zS=new H.GD("hasDisassembly")
+C.eo=new H.GD("hashLink")
+C.Ge=new H.GD("hashLinkWorkaround")
+C.wq=new H.GD("hitStyle")
+C.k6=new H.GD("hoverText")
+C.PJ=new H.GD("human")
+C.q2=new H.GD("idle")
+C.d2=new H.GD("imp")
+C.kN=new H.GD("imports")
+C.eJ=new H.GD("instruction")
+C.iG=new H.GD("instructions")
+C.Py=new H.GD("interface")
+C.h7=new H.GD("ioEnabled")
+C.I9=new H.GD("isBool")
+C.C1=new H.GD("isComment")
+C.Yg=new H.GD("isDartCode")
+C.bR=new H.GD("isDouble")
+C.ob=new H.GD("isError")
+C.Iv=new H.GD("isInstance")
+C.Wg=new H.GD("isInt")
+C.tD=new H.GD("isList")
+C.Of=new H.GD("isNull")
+C.pY=new H.GD("isOptimized")
+C.LA=new H.GD("isPipe")
+C.Lk=new H.GD("isString")
+C.dK=new H.GD("isType")
+C.xf=new H.GD("isUnexpected")
+C.Jx=new H.GD("isolates")
+C.b5=new H.GD("jumpTarget")
+C.kA=new H.GD("lastTokenPos")
+C.ur=new H.GD("lib")
+C.VN=new H.GD("libraries")
+C.VI=new H.GD("line")
+C.cc=new H.GD("listening")
+C.DY=new H.GD("loading")
+C.Lx=new H.GD("localAddress")
+C.M3=new H.GD("localPort")
+C.wT=new H.GD("mainPort")
+C.pX=new H.GD("message")
+C.VD=new H.GD("mouseOut")
+C.NN=new H.GD("mouseOver")
+C.YS=new H.GD("name")
+C.pu=new H.GD("nameIsEmpty")
+C.So=new H.GD("newHeapCapacity")
+C.EK=new H.GD("newHeapUsed")
+C.OV=new H.GD("noSuchMethod")
+C.zO=new H.GD("objectPool")
+C.eH=new H.GD("oldHeapCapacity")
+C.ap=new H.GD("oldHeapUsed")
+C.zm=new H.GD("padding")
+C.Ic=new H.GD("pause")
+C.yG=new H.GD("pauseEvent")
+C.AY=new H.GD("protocol")
+C.I7=new H.GD("readClosed")
+C.GR=new H.GD("refresh")
+C.KX=new H.GD("refreshCoverage")
+C.ja=new H.GD("refreshGC")
+C.MT=new H.GD("registerCallback")
+C.Gi=new H.GD("relativeHashLink")
+C.yL=new H.GD("remoteAddress")
+C.ni=new H.GD("remotePort")
+C.X2=new H.GD("resetAccumulator")
+C.F3=new H.GD("response")
+C.nY=new H.GD("resume")
+C.HD=new H.GD("retainedSize")
+C.iU=new H.GD("retainingPath")
+C.eN=new H.GD("rootLib")
+C.ue=new H.GD("row")
+C.nh=new H.GD("rows")
+C.L2=new H.GD("running")
+C.EA=new H.GD("scripts")
+C.oW=new H.GD("selectExpr")
+C.hd=new H.GD("serviceType")
+C.jM=new H.GD("socketOwner")
+C.DW=new H.GD("sortedRows")
+C.Pf=new H.GD("stacktrace")
+C.Nv=new H.GD("subclass")
+C.hO=new H.GD("tipExclusive")
+C.ei=new H.GD("tipKind")
+C.HK=new H.GD("tipParent")
+C.je=new H.GD("tipTicks")
+C.hN=new H.GD("tipTime")
+C.Q1=new H.GD("toggleExpand")
+C.ID=new H.GD("toggleExpanded")
+C.z6=new H.GD("tokenPos")
+C.bc=new H.GD("topFrame")
+C.Kj=new H.GD("totalSamplesInProfile")
+C.ep=new H.GD("tree")
+C.J2=new H.GD("typeChecksEnabled")
+C.bn=new H.GD("updateLineMode")
+C.mh=new H.GD("uptime")
+C.Fh=new H.GD("url")
+C.jh=new H.GD("v")
+C.zdr=new H.GD("value")
+C.fj=new H.GD("variable")
+C.xw=new H.GD("variables")
+C.zn=new H.GD("version")
+C.Tc=new H.GD("vmName")
+C.Uy=new H.GD("writeClosed")
+C.k5=H.IL('hx')
 C.hP=H.IL('uz')
+C.KS=H.IL('oD')
 C.Mf=H.IL('G1')
 C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
@@ -18717,7 +18160,8 @@
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
 C.Vx=H.IL('MJ')
-C.Vh=H.IL('Pz')
+C.Vh=H.IL('qZ')
+C.dH=H.IL('Pz')
 C.HC=H.IL('F0')
 C.rR=H.IL('wN')
 C.yS=H.IL('G6')
@@ -18738,6 +18182,7 @@
 C.dD=H.IL('av')
 C.FA=H.IL('Ya')
 C.T1=H.IL('Wy')
+C.hG=H.IL('ir')
 C.Th=H.IL('fI')
 C.tU=H.IL('L4')
 C.yT=H.IL('FK')
@@ -18757,7 +18202,6 @@
 C.lp=H.IL('LU')
 C.oG=H.IL('ds')
 C.TU=H.IL('Oz')
-C.nw=H.IL('eo')
 C.OG=H.IL('eW')
 C.oZ=H.IL('HS')
 C.km=H.IL('fl')
@@ -18776,12 +18220,9 @@
 C.qF=H.IL('mO')
 C.Ey=H.IL('wM')
 C.nX=H.IL('DE')
-C.jw=H.IL('xc')
 C.bh=H.IL('i6')
-C.NW=H.IL('ye')
 C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
-C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
 C.Wz=H.IL('pR')
 C.Ep=H.IL('ou')
@@ -18806,7 +18247,6 @@
 C.jK=H.IL('el')
 C.xM=new P.u5F(!1)
 $.libraries_to_load = {}
-$.Fd=1
 $.H9="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
@@ -18816,10 +18256,9 @@
 $.NF=null
 $.TX=null
 $.x7=null
-$.q4=null
+$.nw=null
 $.vv=null
 $.Bv=null
-$.W5=null
 $.BY=null
 $.oK=null
 $.S6=null
@@ -18833,7 +18272,7 @@
 $.Y1=0
 $.ax=0
 $.iq=null
-$.Td=!1
+$.AM=!1
 $.ps=0
 $.xG=null
 $.Bh=0
@@ -18843,10 +18282,10 @@
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dmb},C.Vx,X.MJ,{created:X.Bs},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.Dw},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.TsF},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.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.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.bh,R.i6,{created:R.IT},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.NZ},C.KO,F.ZP,{created:F.Zg},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.EG},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.pD},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vx,X.MJ,{created:X.Bs},C.Vh,Q.qZ,{created:Q.RH},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.KU},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.na},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.lt},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.JR},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.xx},C.KO,F.ZP,{created:F.Yw},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.N0},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Za},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","ma",function(){return $.jk().window})
-I.$lazy($,"globalWorker","ae","RG",function(){return $.jk().Worker})
+I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
+I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Rs",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
@@ -18864,8 +18303,8 @@
 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.PG(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
+I.$lazy($,"_toStringVisiting","nM","Ex",function(){return P.yv(null)})
+I.$lazy($,"_toStringList","yu","tw",function(){return[]})
 I.$lazy($,"webkitEvents","Ha","PO",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
 I.$lazy($,"context","Lt","ca",function(){return P.ND(function(){return this}())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
@@ -18873,17 +18312,17 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","KT","tQ",function(){return P.Fl(P.qU,N.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
+I.$lazy($,"_logger","y7","eI",function(){return N.QM("Observable.dirtyCheck")})
 I.$lazy($,"_instance","qr","V6",function(){return new L.Ul([])})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","jz","Br",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_logger","jz","T5",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","jQ","Nc",function(){return $.ca().Eg("ShadowDOMPolyfill")})
 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($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.NL())})
 I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
 I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
@@ -18893,13 +18332,13 @@
 I.$lazy($,"_ready","T6","ln",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_unbindLog","pH","EM",function(){return N.QM("polymer.unbind")})
 I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_shadowHost","zr","c7",function(){return H.VM(new P.kM(null),[A.dM])})
 I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","AM","qL",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","qM","Js",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","cZ","Dw",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
@@ -18907,12 +18346,12 @@
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Qn","i8",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
 I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={Sa:202}
-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:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code","msg","errorMessage","message",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.dg]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Df",ret:P.qU,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{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:"rf",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"Jw",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.GD,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",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:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.dl]},{func:"h2",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},"s",{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k",{func:"Hb",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]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"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:"Br",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",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:187}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"SF",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"QO",void:true,args:[W.Oq]},"result",{func:"jH",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.dl]},{func:"h2",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},"s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k",{func:"Hb",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]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"Br",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"lb",void:true,args:[W.AW]},"socket","msg","details",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 54ad1c6..952b8be 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -659,16 +659,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &amp;&amp;
                        ref['closureFunc'] != null}}">
-        <a on-click="{{ goto }}" href="{{ url }}">
+        <a href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
@@ -676,7 +676,7 @@
 
       <template if="{{ isInstance(ref.serviceType) &amp;&amp;
                        ref['closureFunc'] == null}}">
-        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ field in ref['fields'] }}">
@@ -694,7 +694,7 @@
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
-        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
@@ -1054,7 +1054,7 @@
     </style>
 
     <li class="menu">
-      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -1102,7 +1102,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+    <li><a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -1138,31 +1138,9 @@
   </template>
 </polymer-element>
 
-<polymer-element name="nav-control" extends="observatory-element">
-  <template>
-    <style>
-      .black {
-        color: #000;
-      }
-      li {
-        float: right;
-        margin: 0;
-      }
-      li button {
-        margin: 3px;
-        padding: 8px;
-      }
-    </style>
-    <li>
-      <button class="black" on-click="{{ back }}">◀</button>
-      <button class="black" on-click="{{ forward }}">▶</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>
@@ -1171,11 +1149,11 @@
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.relativeLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('profile') }}" anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}" anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="allocation profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
   </template>
@@ -1183,7 +1161,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.link }}" anchor="{{ library.name }}" last="{{ last }}">
+    <nav-menu link="{{ library.hashLink }}" anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -1191,7 +1169,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.link }}" anchor="{{ cls.name }}" last="{{ last }}">
+    <nav-menu link="{{ cls.hashLink }}" anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -1439,9 +1417,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('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>
@@ -1699,363 +1676,11 @@
 .break-wrap {
   word-wrap: break-word;
 }
-</style><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
 
-
-
-
-<polymer-element name="class-tree" extends="observatory-element">
-  <template>
-    <style>
-/* Global styles */
-* {
-  margin: 0;
-  padding: 0;
-  font: 400 14px 'Montserrat', sans-serif;
-  color: #333;
-  box-sizing: border-box;
-}
-
-.content {
-  padding-left: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.content-centered {
-  padding-left: 10%;
-  padding-right: 10%;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-h1 {
-  font: 400 18px 'Montserrat', sans-serif;
-}
-
-.memberList {
-  display: table;
-}
-
-.memberItem {
-  display: table-row;
-}
-
-.memberName, .memberValue {
-  display: table-cell;
-  vertical-align: top;
-  padding: 3px 0 3px 1em;
-  font: 400 14px 'Montserrat', sans-serif;
-}
-
-.monospace {
-  font-family: consolas, courier, monospace;
-  font-size: 1em;
-  line-height: 1.2em;
-  white-space: nowrap;
-}
-
-a {
-  color: #0489c3;
-  text-decoration: none;
-}
-
-a:hover {
-  text-decoration: underline;
-}
-
-em {
-  color: inherit;
-  font-style: italic;
-}
-
-b {
-  color: inherit;
-  font-weight: bold;
-}
-
-hr {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  border: 0;
-  border-top: 1px solid #eee;
-  height: 0;
-  box-sizing: content-box;
-}
-
-.list-group {
-  padding-left: 0;
-  margin-bottom: 20px;
-}
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  margin-bottom: -1px;
-  background-color: #fff;
-}
-
-.list-group-item:first-child {
-  /* rounded top corners */
-  border-top-right-radius:4px;
-  border-top-left-radius:4px;
-}
-
-.list-group-item:last-child {
-  margin-bottom: 0;
-  /* rounded bottom corners */
-  border-bottom-right-radius: 4px;
-  border-bottom-left-radius:4px;
-}
-
-/* Flex row container */
-.flex-row {
-  display: flex;
-  flex-direction: row;
-}
-
-/* Flex column container */
-.flex-column {
-  display: flex;
-  flex-direction: column;
-}
-
-.flex-item-fit {
-  flex-grow: 1;
-  flex-shrink: 1;
-  flex-basis: auto;
-}
-
-.flex-item-no-shrink {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: auto;
-}
-
-.flex-item-fill {
-  flex-grow: 0;
-  flex-shrink: 1;  /* shrink when pressured */
-  flex-basis: 100%;  /* try and take 100% */
-}
-
-.flex-item-fixed-1-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 8.3%;
-}
-
-.flex-item-fixed-2-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 16.6%;
-}
-
-.flex-item-fixed-4-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 33.3333%;
-}
-
-.flex-item-fixed-6-12, .flex-item-50-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 50%;
-}
-
-.flex-item-fixed-8-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 66.6666%;
-}
-
-.flex-item-fixed-9-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 75%;
-}
-
-
-.flex-item-fixed-12-12 {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 100%;
-}
-
-.flex-item-10-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 10%;
-}
-
-.flex-item-15-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 15%;
-}
-
-.flex-item-20-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 20%;
-}
-
-.flex-item-30-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 30%;
-}
-
-.flex-item-40-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 40%;
-}
-
-.flex-item-60-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 60%;
-}
-
-.flex-item-70-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 70%;
-}
-
-.flex-item-80-percent {
-  flex-grow: 0;
-  flex-shrink: 0;
-  flex-basis: 80%;
-}
-
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: #f5f5f5;
-  border: 1px solid #e3e3e3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
-}
-
-.break-wrap {
-  word-wrap: break-word;
-}
-</style>
-    <style>
-      .table {
-        border-collapse: collapse!important;
-        width: 100%;
-        margin-bottom: 20px
-      }
-      .table thead > tr > th,
-      .table tbody > tr > th,
-      .table tfoot > tr > th,
-      .table thead > tr > td,
-      .table tbody > tr > td,
-      .table tfoot > tr > td {
-        padding: 8px;
-        vertical-align: top;
-      }
-      .table thead > tr > th {
-        vertical-align: bottom;
-        text-align: left;
-        border-bottom:2px solid #ddd;
-      }
-
-      tr:hover > td {
-        background-color: #FFF3E3;
-      }
-      .rowColor0 {
-        background-color: #FFE9CC;
-      }
-      .rowColor1 {
-        background-color: #FFDEB2;
-      }
-      .rowColor2 {
-        background-color: #FFD399;
-      }
-      .rowColor3 {
-        background-color: #FFC87F;
-      }
-      .rowColor4 {
-        background-color: #FFBD66;
-      }
-      .rowColor5 {
-        background-color: #FFB24C;
-      }
-      .rowColor6 {
-        background-color: #FFA733;
-      }
-      .rowColor7 {
-        background-color: #FF9C19;
-      }
-      .rowColor8 {
-        background-color: #FF9100;
-      }
-
-      .tooltip {
-        display: block;
-        position: absolute;
-        visibility: hidden;
-        opacity: 0;
-        transition: visibility 0s linear 0.5s;
-        transition: opacity .4s ease-in-out;
-      }
-
-      tr:hover .tooltip {
-        display: block;
-        position: absolute;
-        top: 100%;
-        right: 100%;
-        visibility: visible;
-        z-index: 999;
-        width: 400px;
-        color: #ffffff;
-        background-color: #0489c3;
-        border-top-right-radius: 8px;
-        border-top-left-radius: 8px;
-        border-bottom-right-radius: 8px;
-        border-bottom-left-radius: 8px;
-        transition: visibility 0s linear 0.5s;
-        transition: opacity .4s ease-in-out;
-        opacity: 1;
-      }
-
-      .white {
-        color: #ffffff;
-      }
-    </style>
-    <nav-bar>
-      <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
-    </nav-bar>
-    <div class="content-centered">
-      <h1>Class Hierarchy</h1>
-      <table id="tableTree" class="table">
-        <thead>
-          <tr>
-            <th>Class</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr template="" repeat="{{row in tree.rows }}">
-            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-              <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span>
-              <class-ref ref="{{ row.cls }}"></class-ref>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-  </template>
-</polymer-element>
-
-
-
   
   
   
@@ -2430,7 +2055,7 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
   
@@ -2681,7 +2306,7 @@
      --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 
 </polymer-element>
@@ -2925,10 +2550,10 @@
 }
 </style>
   <template if="{{ nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    <a href="{{ url }}">unnamed</a>
   </template>
   <template if="{{ !nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
 
@@ -3174,7 +2799,7 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 
 </polymer-element>
@@ -3419,18 +3044,17 @@
     <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.isAbstract }}">
+        <template if="{{ cls['abstract'] }}">
           abstract
         </template>
-        <template if="{{ cls.isPatch }}">
+        <template if="{{ cls['patch'] }}">
           patch
         </template>
         class {{ cls.name }}
@@ -3439,32 +3063,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.superClass != null }}">
+        <template if="{{ cls['super'] != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls['super'] }}"></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>
@@ -3473,11 +3097,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>
@@ -3498,19 +3122,19 @@
       </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>
@@ -3526,11 +3150,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 }}">
@@ -3795,10 +3419,10 @@
 </style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
+          <a href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+          <a href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
@@ -4100,7 +3724,6 @@
       <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 &amp;&amp; code.isOptimized }}">
@@ -4465,7 +4088,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -4730,9 +4352,8 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -5321,9 +4942,8 @@
 </style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content-centered">
@@ -5905,9 +5525,8 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -6259,9 +5878,8 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('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>
@@ -6521,7 +6139,6 @@
     <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">
@@ -6531,7 +6148,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -6539,7 +6156,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
         </li>
       </ul>
 
@@ -6547,7 +6164,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
         </li>
       </ul>
 
@@ -6555,7 +6172,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -6563,7 +6180,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
         </li>
       </ul>
 
@@ -7326,7 +6943,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -7845,7 +7462,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -8680,7 +8297,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -9445,7 +9062,7 @@
   word-wrap: break-word;
 }
 </style>
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -10481,10 +10098,10 @@
 }
 </style>
     <template if="{{ small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+      <a href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
@@ -10804,6 +10421,7 @@
 
 
 
+
 <polymer-element name="isolate-ref" extends="service-ref">
 <template><style>
 /* Global styles */
@@ -11041,10 +10659,10 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-</polymer-element>
 
+</polymer-element>
 
   
   
@@ -11658,33 +11276,28 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            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>
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
           </div>
         </div>
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
         </template>
@@ -11966,7 +11579,6 @@
       <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">
@@ -12037,7 +11649,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
@@ -12332,7 +11944,6 @@
       <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 }}">
@@ -12758,7 +12369,6 @@
       <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">
@@ -12885,6 +12495,9 @@
 
   
   
+
+  
+  
   
   
   
@@ -13175,11 +12788,10 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap 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">
@@ -13584,9 +13196,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
@@ -14013,8 +13624,8 @@
       </li>
     </nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    <nav-control></nav-control>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}">
@@ -14268,9 +13879,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('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">
@@ -14540,7 +14150,6 @@
     <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">
@@ -14565,7 +14174,7 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
+            See <a href="#/flags">flags</a>
           </div>
         </div>
       </div>
@@ -14590,8 +14199,15 @@
        an observable property on the old element to an invalid type. -->
   
 </polymer-element>
-<polymer-element name="observatory-application" extends="observatory-element">
-  <!-- This element explicitly manages its child elements -->
+<polymer-element name="response-viewer" extends="observatory-element">
+  <template>
+    <service-view object="{{ app.response }}"></service-view>
+  </template>
+  
+</polymer-element><polymer-element name="observatory-application" extends="observatory-element">
+  <template>
+    <response-viewer app="{{ this.app }}"></response-viewer>
+  </template>
   
 </polymer-element>
 
@@ -14837,7 +14453,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ exception.kind }}</h1>
@@ -15093,7 +14708,6 @@
 </style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
-      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -15342,7 +14956,7 @@
   word-wrap: break-word;
 }
 </style>
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
index 05581be..244ac94 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html._data
@@ -1 +1 @@
-{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
+{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/collapsible_content.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/response_viewer.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 6e26e9e..9a82ab7 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
@@ -193,7 +193,7 @@
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,65],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 yEe:{
@@ -208,20 +208,20 @@
 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]},
-QI:{
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,65]},
+wm:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
 iC:{
-"^":"QI;"},
+"^":"wm;"},
 kdQ:{
-"^":"QI;"},
+"^":"wm;"},
 Q:{
 "^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
+W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
 xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
@@ -234,12 +234,12 @@
 for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},31],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},28],
 FV:function(a,b){var z
 for(z=J.mY(b);z.G();)this.h(a,z.gl())},
 V1:function(a){this.sB(a,0)},
 aN:function(a,b){return H.bQ(a,b)},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"Q")},31],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},28],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -256,7 +256,7 @@
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
 Mu:function(a,b,c){H.xF(a,b,c)
 return H.j5(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
+geK:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
@@ -272,12 +272,12 @@
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-Vr:function(a,b){return H.Ck(a,b)},
+Vr:function(a,b){return H.qo(a,b)},
 XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-kJ:function(a,b){return this.XU(a,b,0)},
+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
@@ -366,7 +366,7 @@
 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},
+KI: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
@@ -391,7 +391,7 @@
 gbx:function(a){return C.yT},
 $isFK:true,
 static:{"^":"SAz,N6l"}},
-Xh:{
+L7:{
 "^":"P;",
 gbx:function(a){return C.yw},
 $isCP:true,
@@ -475,7 +475,7 @@
 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},
-kJ:function(a,b){return this.XU(a,b,0)},
+u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){var z,y
 c=a.length
 z=b.length
@@ -532,7 +532,7 @@
 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.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
-y.qi(a)
+y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
@@ -545,9 +545,9 @@
 init.globalState.Nr=u
 init.globalState.N0=u
 y=H.G3()
-x=H.fH(y,[y]).BD(a)
+x=H.KT(y,[y]).BD(a)
 if(x)u.vV(0,new H.PK(z,a))
-else{y=H.fH(y,[y,y]).BD(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
@@ -564,7 +564,7 @@
 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
+Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Kh(b.data)
 y=J.U6(z)
 switch(y.t(z,"command")){case"start":init.globalState.oL=y.t(z,"id")
@@ -586,8 +586,20 @@
 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))
+case"spawn-worker":q=y.t(z,"functionName")
+m=y.t(z,"uri")
+p=y.t(z,"args")
+o=y.t(z,"msg")
+l=y.t(z,"isSpawnUri")
+k=y.t(z,"startPaused")
+y=y.t(z,"replyPort")
+if(m==null)m=$.Rs()
+j=new Worker(m)
+j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
+i=init.globalState.Y7++
+$.p6().u(0,j,i)
+init.globalState.XC.u(0,i,j)
+j.postMessage(H.t0(P.EF(["command","start","id",i,"replyTo",H.t0(y),"args",p,"msg",H.t0(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
 break
 case"message":if(y.t(z,"port")!=null)J.m9(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
@@ -611,41 +623,6 @@
 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.RY(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.tZ(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.vd
-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=$.Rs()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.cz(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.Jz(),P.Jz(),!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(new H.IY(w,new H.H5(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
@@ -654,15 +631,10 @@
 y=z.EE
 x=init.globalState.N0.jO
 w=z.um
-J.m9(f,["spawned",new H.ws(y,x),w,z.PX])
+J.m9(f,["spawned",new H.Ze(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(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","Hb",6,0,null,2,3,4],
 t0:function(a){var z
 if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
 z.mR=new H.aJ(null)
@@ -674,18 +646,18 @@
 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",
+"^":"Tp:66;a,b",
 $0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:69;a,c",
+"^":"Tp:66;a,c",
 $0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,vd,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.ma()==null
-y=$.RG()
+"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
+i6:function(a){var z,y,x,w
+z=$.My()==null
+y=$.nB()
 x=z&&$.JU()===!0
 this.EF=x
 if(!x)y=y!=null&&$.Rs()!=null
@@ -696,7 +668,7 @@
 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.i2=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.vd=z
@@ -704,13 +676,13 @@
 $.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",
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lJ,CN,M2,mf,pa,ir",
 V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
+if(this.lJ.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=this.lJ
 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()
@@ -781,7 +753,7 @@
 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],
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,67,68],
 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
@@ -805,7 +777,7 @@
 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)
+PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.i2.u(0,this.jO,this)
 else this.Dm()},
 Dm:[function(){var z,y
 z=this.M2
@@ -813,14 +785,14 @@
 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)
+init.globalState.i2.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.m9(z.lo,null)
-this.CN=null}},"$0","gQb",0,0,18],
+this.CN=null}},"$0","gQb",0,0,15],
 $isaX:true},
 NY:{
-"^":"Tp:18;a",
+"^":"Tp:15;a",
 $0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
@@ -830,18 +802,18 @@
 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."))
+if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.vd
+if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
 x=H.t0(P.EF(["command","close"],null,null))
 y.toString
 self.postMessage(x)}return!1}J.R1(z)
 return!0},
-oV:function(){if($.ma()!=null)new H.QB(this).$0()
+Wu:function(){if($.My()!=null)new H.QB(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)
+if(init.globalState.EF!==!0)this.Wu()
+else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 w=init.globalState.vd
@@ -849,70 +821,44 @@
 w.toString
 self.postMessage(v)}}},
 QB:{
-"^":"Tp:18;a",
+"^":"Tp:15;a",
 $0:[function(){if(!this.a.xB())return
-P.cH(C.ny,this)},"$0",null,0,0,null,"call"],
+P.ww(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
 "^":"a;od*,i3,G1>",
 Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
+return}J.QT(this.od,this.i3)},"$0","gNN",0,0,15],
 $isIY:true},
 JH:{
 "^":"a;"},
 mN:{
-"^":"Tp:69;a,b,c,d,e,f",
+"^":"Tp:66;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.m9(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.m9(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-tZ:{
-"^":"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.rC(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-cz:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.rC(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-H5:{
-"^":"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",
+"^":"Tp:15;a,b,c,d,e",
 $0:[function(){var z,y,x
 this.e.sxF(!0)
 if(this.d!==!0)this.a.$1(this.c)
 else{z=this.a
 y=H.G3()
-x=H.fH(y,[y,y]).BD(z)
+x=H.KT(y,[y,y]).BD(z)
 if(x)z.$2(this.b,this.c)
-else{y=H.fH(y,[y]).BD(z)
+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;",
 $isRZ:true,
-$ishq:true},
-ws:{
+$iswC:true},
+Ze:{
 "^":"Iy4;JE,tv",
 wR:function(a,b){var z,y,x,w,v
 z={}
 y=this.tv
-x=init.globalState.iR.t(0,y)
+x=init.globalState.i2.t(0,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
@@ -924,13 +870,13 @@
 w="receive "+H.d(b)
 y.Rk.NZ(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)},
+return!!J.x(b).$isZe&&J.xC(this.JE,b.JE)},
 giO:function(a){return J.Mo(this.JE)},
-$isws:true,
+$isZe:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 Ua:{
-"^":"Tp:69;a,b,c",
+"^":"Tp:66;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
@@ -946,14 +892,14 @@
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
+z=J.xs(this.ZU,16)
+y=J.xs(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
 $isdd:true,
 $isRZ:true,
-$ishq:true},
+$iswC:true},
 yo:{
 "^":"a;x6>,D1,P0<",
 zd:function(a){return this.D1.$1(a)},
@@ -972,46 +918,32 @@
 this.zd(a)},
 $isyo:true,
 static:{"^":"Fd"}},
-A1:{
-"^":"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},
 RS:{
 "^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
+DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
 if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
 yf:function(a){if(!!a.$isiV)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
 Qt:{
-"^":"Jl;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
+"^":"ooy;mR",
+DE:function(a){if(!!a.$isZe)return new H.Ze(a.JE,a.tv)
 if(!!a.$isdd)return new H.dd(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.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
 BV:{
-"^":"fPc;RZ",
+"^":"lY;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(J.xC(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
 if(v==null)return
 u=v.iQ(w)
 if(u==null)return
-return new H.ws(u,x)}else return new H.dd(y,w,x)},
+return new H.Ze(u,x)}else return new H.dd(y,w,x)},
 Op:function(a){return new H.iV(J.UQ(a,1))}},
 aJ:{
 "^":"a;MD",
@@ -1040,12 +972,12 @@
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
 if(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isZ0)return this.pi(a)
 if(!!z.$isRZ)return this.DE(a)
-if(!!z.$ishq)return this.yf(a)
+if(!!z.$iswC)return this.yf(a)
 return this.N1(a)},
 N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-Jl:{
+ooy:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y,x,w
@@ -1058,7 +990,7 @@
 this.mR.u(0,a,z)
 for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
 return z},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z={}
 y=this.mR.t(0,a)
 z.a=y
@@ -1071,7 +1003,7 @@
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.b
 J.kW(this.a.a,z.Q9(a),z.Q9(b))},
 $isEH:true},
@@ -1084,7 +1016,7 @@
 y=this.Ao++
 this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
-TI:function(a){var z,y
+pi:function(a){var z,y
 z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
 y=this.Ao++
@@ -1100,7 +1032,7 @@
 x[w]=v}return x},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
+lY:{
 "^":"a;",
 ug:function(a){if(H.ZR(a))return a
 this.RZ=P.YM(null,null,null,null,null)
@@ -1163,12 +1095,12 @@
 z.Qa(a,b)
 return z}}},
 Av:{
-"^":"Tp:18;a,b",
+"^":"Tp:15;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Wl:{
-"^":"Tp:18;c,d",
+"^":"Tp:15;c,d",
 $0:[function(){this.c.p9=null
 H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
@@ -1193,7 +1125,7 @@
 y=b.x6
 return z==null?y==null:z===y}return!1},
 $isiV:true,
-$ishq:true}}],["_js_helper","dart:_js_helper",,H,{
+$iswC:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
 Gp:function(a,b){var z
 if(b!=null){z=b.x
@@ -1209,7 +1141,7 @@
 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],
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,2],
 BU:function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.kk()
 if(typeof a!=="string")H.vh(P.u(a))
@@ -1295,7 +1227,7 @@
 return a.date},
 of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 return a[b]},
-wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+R0:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
 a[b]=c},
 zo:function(a,b,c){var z,y,x
 z={}
@@ -1338,7 +1270,7 @@
 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],
+tM:[function(){return J.AG(this.dartException)},"$0","nR",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)
@@ -1392,7 +1324,7 @@
 else if(z.n(c,2))return H.zd(b,new H.uZ(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.OQ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","dm",14,0,null,6,7,8,9,10,11,12],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","Q8",14,0,null,3,4,5,6,7,8,9],
 tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -1421,7 +1353,7 @@
 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
+else if(u&&typeof x=="function"){q=t?H.HY:H.dS
 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
@@ -1430,7 +1362,7 @@
 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
+vq:function(a,b,c,d){var z=H.dS
 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)
@@ -1459,7 +1391,7 @@
 $.OK=J.ew(w,1)
 return new Function(v+H.d(w)+"}")()},
 Z4:function(a,b,c,d){var z,y
-z=H.uj
+z=H.dS
 y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.Yi("Intercepted function with no arguments."))
 case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
@@ -1500,10 +1432,10 @@
 if(z)return a
 H.aE(a,b)},
 ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-fH:function(a,b,c){return new H.GN(a,b,c,null)},
+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.ac(z,b,null)},
+return new H.Tu(z,b,null)},
 G3:function(){return C.KZ},
 IL:function(a){return new H.cu(a,null)},
 VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
@@ -1620,17 +1552,17 @@
 ml:function(a,b,c){return a.apply(b,c)},
 Pq:function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-KS:function(a){return H.eQ(a)},
+wzi:function(a){return H.eQ(a)},
 bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
 w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
-y=$.q4[z]
+y=$.nw[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(z!=null){y=$.nw[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
@@ -1638,7 +1570,7 @@
 x=w.prototype
 v=z[0]
 if(v==="!"){y=H.Va(x)
-$.q4[z]=y
+$.nw[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)
@@ -1661,7 +1593,7 @@
 $.Bv=!0
 H.Z1()},
 Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
+$.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
 z=init.interceptorsByTag
@@ -1742,8 +1674,8 @@
 gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
 hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,76,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,70,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -1763,18 +1695,18 @@
 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)
+if(this.xI!==0)return P.Fl(P.IN,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)
+if(y===0)return P.Fl(P.IN,null)
+v=P.L5(null,null,null,P.IN,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},
+v.u(0,new H.GD(t),x[s])}return v},
 static:{"^":"hAw,eHF,zl"}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
@@ -1805,7 +1737,7 @@
 H.bQ(y,new H.uV(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
 return z[a]},
-static:{"^":"t4,FV,OcN,yM",zh:function(a){var z,y,x
+static:{"^":"t4A,FV,OcN,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
@@ -1814,7 +1746,7 @@
 x=z[1]
 return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
 uV:{
-"^":"Tp:5;a,b,c",
+"^":"Tp:2;a,b,c",
 $1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
@@ -1823,14 +1755,14 @@
 z[y]=x},
 $isEH:true},
 lk:{
-"^":"Tp:77;a,b,c",
+"^":"Tp:71;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:77;a,b",
+"^":"Tp:71;a,b",
 $2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
 else this.a.a=!0},
@@ -1890,7 +1822,7 @@
 bu:function(a){var z=this.K9
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},
 $isEH:true},
@@ -1905,23 +1837,23 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:69;b,c",
+"^":"Tp:66;b,c",
 $0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:69;d,e,f",
+"^":"Tp:66;d,e,f",
 $0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
+"^":"Tp:66;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",
+"^":"Tp:66;w3,HZ,mG,xC,cj",
 $0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
 $isEH:true},
 Tp:{
@@ -1943,7 +1875,7 @@
 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
+static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
 if(z==null){z=H.Iq("self")
 $.bf=z}return z},Iq:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
@@ -2017,7 +1949,7 @@
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
 return y},
 bu:function(a){return this.oc}},
-ac:{
+Tu:{
 "^":"lbp;oc>,re<,Et",
 za:function(){var z,y
 z=this.Et
@@ -2044,15 +1976,15 @@
 $iscu:true,
 $isuq:true},
 dC:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a(a)},
 $isEH:true},
 VX:{
-"^":"Tp:78;b",
+"^":"Tp:72;b",
 $2:function(a,b){return this.b(a,b)},
 $isEH:true},
 vZ:{
-"^":"Tp:5;c",
+"^":"Tp:2;c",
 $1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
@@ -2094,7 +2026,11 @@
 if(y[w]!=null)return
 C.Nm.sB(y,w)
 return H.Mr(this,y)},
-wL:function(a,b,c){if(c<0||c>J.q8(b))throw H.b(P.TE(c,0,J.q8(b)))
+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,
@@ -2155,10 +2091,10 @@
 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)},
-pp:[function(a,b,c,d){var z=a.fi
+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).wM(new X.jE(a))}},"$3","gNa",6,0,79,46,47,80],
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,73,43,44,74],
 static:{zy:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -2175,10 +2111,10 @@
 C.Gx.XI(a)
 return a}}},
 LPc:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:69;a",
+"^":"Tp:66;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,{
@@ -2187,7 +2123,7 @@
 N.QM("").To("Google Charts API loaded")
 z=J.UQ(J.UQ($.ca(),"google"),"visualization")
 $.BY=z
-return z},"$1","vN",2,0,13,14],
+return z},"$1","vN",2,0,10,11],
 dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
 o1:function(a,b){var z
 for(z="";b>1;){--b
@@ -2199,7 +2135,7 @@
 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],
+a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,12],
 P0:function(a){var z,y,x,w
 z=C.CD.yu(C.CD.UD(a*1000))
 y=C.jn.cU(z,3600000)
@@ -2215,7 +2151,7 @@
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,15,16],
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Fx",2,0,12,13],
 mG:function(a){var z,y,x,w
 if(a==null)return"-"
 z=J.LL(J.vX(a,1000))
@@ -2227,92 +2163,27 @@
 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(){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;i6,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){this.i6.wv.cv(a).ml(new G.zv(this))},
-LQ:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.Mi(this.a.yF,a)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;i6,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.i6.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-LQ: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,82,"call"],
-$isEH:true},
-dx:{
-"^":"uG;i6,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.i6.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-LQ:function(a){return J.co(a,"error/")}},
 mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,wC,EC,fz,AP,fn",
+"^":"Pi;Z6,wv>,Eb,AJ,fz,AP,fn",
 god:function(a){return this.Eb},
 sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
+gbA:function(a){return this.AJ},
+sbA:function(a,b){this.AJ=F.Wi(this,C.F3,this.AJ,b)},
 Da:function(){var z,y
-this.om()
+z=this.Z6
+z.ec=this
+z.kI()
 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.Hj.Ph,!1),[null])
-H.VM(new W.fd(0,y.bi,y.Ph,W.aF(z.gbQ()),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.dx(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.mQ("error/")},"$1","gbf",2,0,83,24],
-t1:[function(a){this.EC=a
-this.mQ("error/")},"$1","gXa",2,0,84,85],
-mQ:function(a){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.LQ(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.a9())},
-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.wC
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
+H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
+kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gbf",2,0,75,21],
+t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gXa",2,0,76,77],
+US:function(){this.Da()},
+hq:function(){this.Da()}},
 Kf:{
 "^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
@@ -2326,32 +2197,37 @@
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
 this.vR.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){if(J.Qe(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-this.ec.mQ(a)},
-f7:[function(a){window.history.go(-1)},"$0","gSk",0,0,18],
-og:[function(a){window.history.go(1)},"$0","gWc",0,0,18],
-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.gAE(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)}},
-ng:{
-"^":"yVe;hS,ec,c5,R9,V2,me",
-Cy:function(){var z="/"+H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="/#"+this.hS
-window.history.replaceState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gbQ",2,0,86,14]},
+hq:{
+"^":"Pi;ec,JL,AP,fn",
+kI:function(){var z=H.VM(new W.RO(window,C.yZ.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
+if(window.location.hash==="")window.location.hash="#/vm"
+else this.df()},
+df:function(){var z,y,x
+z=window.location.hash
+z=F.Wi(this,C.M8,this.JL,z)
+this.JL=z
+if(!J.co(z,"#/"))return
+y=J.ZZ(this.JL,2).split("#")
+z=y.length
+if(0>=z)return H.e(y,0)
+x=z>1?y[1]:""
+if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
+this.ec.wv.cv(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
+static:{"^":"K3D"}},
+Qe:{
+"^":"Tp:10;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,78,"call"],
+$isEH:true},
+wX:{
+"^":"Tp:10;a,b",
+$1:[function(a){var z,y
+z=this.a
+y=z.ec
+y.AJ=F.Wi(y,C.F3,y.AJ,a)
+z=z.ec
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,79,"call"],
+$isEH:true},
 Y2:{
 "^":"Pi;eT>,yt<,ks>,oH<",
 gyX:function(a){return this.PU},
@@ -2369,17 +2245,11 @@
 $isY2:true},
 XN:{
 "^":"Pi;WT>,AP,fn",
-rT:function(a){var z,y
-z=this.WT
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
 qU:function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
 x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.kJ(z,x)+1,J.Mx(x))
+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)
@@ -2389,11 +2259,11 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-v=w.kJ(z,a)+1
+v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-zb:{
+Ktd:{
 "^":"a;ph>,xy<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
+static:{mb:[function(a){return a!=null?J.AG(a):"<null>"},"$1","HP",2,0,14]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
@@ -2417,19 +2287,19 @@
 y=J.UQ(J.U8o(z[a]),b)
 z=this.oH
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gwy",4,0,87,88,89],
+return z[b].gxy().$1(y)},"$2","gwy",4,0,80,81,82],
 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],
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,82],
 TK:[function(a,b){var z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,90,88,89]},
+return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,83,81,82]},
 BD:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){var z,y,x,w
 z=this.a
 y=z.WT
@@ -2442,1631 +2312,1603 @@
 $isEH:true}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
 E24:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.ET,new E.Cv(),C.Ph,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.fV,new E.e25(),C.jU,new E.e26(),C.Gd,new E.e27(),C.OO,new E.e28(),C.Mc,new E.e29(),C.FP,new E.e30(),C.kF,new E.e31(),C.UD,new E.e32(),C.Aq,new E.e33(),C.DS,new E.e34(),C.C9,new E.e35(),C.VF,new E.e36(),C.uU,new E.e37(),C.YJ,new E.e38(),C.eF,new E.e39(),C.oI,new E.e40(),C.ST,new E.e41(),C.Uj,new E.e42(),C.QH,new E.e43(),C.qX,new E.e44(),C.rE,new E.e45(),C.nf,new E.e46(),C.pO,new E.e47(),C.EI,new E.e48(),C.JB,new E.e49(),C.Uq,new E.e50(),C.A8,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.ak,new E.e57(),C.Ge,new E.e58(),C.He,new E.e59(),C.wq,new E.e60(),C.k6,new E.e61(),C.oj,new E.e62(),C.PJ,new E.e63(),C.Ms,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.eJ,new E.e69(),C.iG,new E.e70(),C.Py,new E.e71(),C.pC,new E.e72(),C.uu,new E.e73(),C.qs,new E.e74(),C.h7,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.kA,new E.e102(),C.Wn,new E.e103(),C.ur,new E.e104(),C.VN,new E.e105(),C.EV,new E.e106(),C.VI,new E.e107(),C.eh,new E.e108(),C.SA,new E.e109(),C.kV,new E.e110(),C.vp,new E.e111(),C.cc,new E.e112(),C.DY,new E.e113(),C.Lx,new E.e114(),C.M3,new E.e115(),C.wT,new E.e116(),C.SR,new E.e117(),C.t6,new E.e118(),C.rP,new E.e119(),C.pX,new E.e120(),C.VD,new E.e121(),C.NN,new E.e122(),C.UX,new E.e123(),C.YS,new E.e124(),C.pu,new E.e125(),C.So,new E.e126(),C.EK,new E.e127(),C.td,new E.e128(),C.Gn,new E.e129(),C.zO,new E.e130(),C.eH,new E.e131(),C.ap,new E.e132(),C.Ys,new E.e133(),C.zm,new E.e134(),C.XM,new E.e135(),C.Ic,new E.e136(),C.yG,new E.e137(),C.tW,new E.e138(),C.CG,new E.e139(),C.Wj,new E.e140(),C.vb,new E.e141(),C.UL,new E.e142(),C.AY,new E.e143(),C.QK,new E.e144(),C.AO,new E.e145(),C.I7,new E.e146(),C.xP,new E.e147(),C.Wm,new E.e148(),C.GR,new E.e149(),C.KX,new E.e150(),C.ja,new E.e151(),C.Dj,new E.e152(),C.ir,new E.e153(),C.yL,new E.e154(),C.ni,new E.e155(),C.X2,new E.e156(),C.F3,new E.e157(),C.UY,new E.e158(),C.Aa,new E.e159(),C.nY,new E.e160(),C.HD,new E.e161(),C.iU,new E.e162(),C.eN,new E.e163(),C.ue,new E.e164(),C.nh,new E.e165(),C.L2,new E.e166(),C.Gs,new E.e167(),C.bE,new E.e168(),C.YD,new E.e169(),C.PX,new E.e170(),C.N8,new E.e171(),C.EA,new E.e172(),C.oW,new E.e173(),C.hd,new E.e174(),C.XY,new E.e175(),C.kz,new E.e176(),C.pH,new E.e177(),C.Ve,new E.e178(),C.jM,new E.e179(),C.DW,new E.e180(),C.PM,new E.e181(),C.k5,new E.e182(),C.Nv,new E.e183(),C.Cw,new E.e184(),C.TW,new E.e185(),C.xS,new E.e186(),C.mi,new E.e187(),C.zz,new E.e188(),C.hO,new E.e189(),C.ei,new E.e190(),C.HK,new E.e191(),C.je,new E.e192(),C.hN,new E.e193(),C.Q1,new E.e194(),C.ID,new E.e195(),C.z6,new E.e196(),C.bc,new E.e197(),C.kw,new E.e198(),C.ep,new E.e199(),C.J2,new E.e200(),C.zU,new E.e201(),C.bn,new E.e202(),C.mh,new E.e203(),C.Fh,new E.e204(),C.jh,new E.e205(),C.fj,new E.e206(),C.xw,new E.e207(),C.zn,new E.e208(),C.RJ,new E.e209(),C.Tc,new E.e210(),C.YE,new E.e211(),C.Uy,new E.e212()],null,null)
-y=P.EF([C.aP,new E.e213(),C.cg,new E.e214(),C.S4,new E.e215(),C.AV,new E.e216(),C.bk,new E.e217(),C.lH,new E.e218(),C.kG,new E.e219(),C.XA,new E.e220(),C.i4,new E.e221(),C.bJ,new E.e222(),C.WZ,new E.e223(),C.VK,new E.e224(),C.aH,new E.e225(),C.PI,new E.e226(),C.Gr,new E.e227(),C.tP,new E.e228(),C.yh,new E.e229(),C.Zb,new E.e230(),C.ne,new E.e231(),C.B0,new E.e232(),C.mr,new E.e233(),C.YT,new E.e234(),C.WQ,new E.e235(),C.jU,new E.e236(),C.Gd,new E.e237(),C.OO,new E.e238(),C.Mc,new E.e239(),C.QH,new E.e240(),C.rE,new E.e241(),C.nf,new E.e242(),C.Ql,new E.e243(),C.ak,new E.e244(),C.Ge,new E.e245(),C.He,new E.e246(),C.oj,new E.e247(),C.Ms,new E.e248(),C.d2,new E.e249(),C.fn,new E.e250(),C.Py,new E.e251(),C.uu,new E.e252(),C.qs,new E.e253(),C.a0,new E.e254(),C.rB,new E.e255(),C.Lc,new E.e256(),C.hf,new E.e257(),C.uk,new E.e258(),C.kA,new E.e259(),C.ur,new E.e260(),C.EV,new E.e261(),C.eh,new E.e262(),C.SA,new E.e263(),C.kV,new E.e264(),C.vp,new E.e265(),C.SR,new E.e266(),C.t6,new E.e267(),C.UX,new E.e268(),C.YS,new E.e269(),C.td,new E.e270(),C.zO,new E.e271(),C.Ys,new E.e272(),C.XM,new E.e273(),C.Ic,new E.e274(),C.tW,new E.e275(),C.Wj,new E.e276(),C.vb,new E.e277(),C.QK,new E.e278(),C.AO,new E.e279(),C.xP,new E.e280(),C.GR,new E.e281(),C.KX,new E.e282(),C.ja,new E.e283(),C.Dj,new E.e284(),C.X2,new E.e285(),C.UY,new E.e286(),C.Aa,new E.e287(),C.nY,new E.e288(),C.HD,new E.e289(),C.iU,new E.e290(),C.eN,new E.e291(),C.Gs,new E.e292(),C.bE,new E.e293(),C.YD,new E.e294(),C.PX,new E.e295(),C.XY,new E.e296(),C.pH,new E.e297(),C.Ve,new E.e298(),C.jM,new E.e299(),C.PM,new E.e300(),C.Nv,new E.e301(),C.Cw,new E.e302(),C.TW,new E.e303(),C.mi,new E.e304(),C.zz,new E.e305(),C.z6,new E.e306(),C.kw,new E.e307(),C.zU,new E.e308(),C.RJ,new E.e309(),C.YE,new E.e310()],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.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.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.j2,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],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.by],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.j2,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.j2,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.pH,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.xY,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.j2,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.VK,C.m8],null,null),C.l4,C.CM,C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.ET,"assertsEnabled",C.Ph,"back",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.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.Uj,"forward",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.pC,"interfaces",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",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.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.ir,"relativeLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",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.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.To,new E.waE(),C.XA,new E.Ore(),C.i4,new E.YLa(),C.qt,new E.wfa(),C.p1,new E.Oaa(),C.bJ,new E.e0(),C.ox,new E.e1(),C.WZ,new E.e2(),C.i0,new E.e3(),C.iE,new E.e4(),C.f4,new E.e5(),C.VK,new E.e6(),C.aH,new E.e7(),C.PI,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.Gr,new E.e11(),C.tP,new E.e12(),C.yh,new E.e13(),C.Zb,new E.e14(),C.u7,new E.e15(),C.ne,new E.e16(),C.B0,new E.e17(),C.r1,new E.e18(),C.mr,new E.e19(),C.Ek,new E.e20(),C.Pn,new E.e21(),C.YT,new E.e22(),C.R3,new E.e23(),C.WQ,new E.e24(),C.jU,new E.e25(),C.Gd,new E.e26(),C.OO,new E.e27(),C.Mc,new E.e28(),C.FP,new E.e29(),C.kF,new E.e30(),C.UD,new E.e31(),C.Aq,new E.e32(),C.DS,new E.e33(),C.C9,new E.e34(),C.VF,new E.e35(),C.uU,new E.e36(),C.YJ,new E.e37(),C.eF,new E.e38(),C.oI,new E.e39(),C.ST,new E.e40(),C.QH,new E.e41(),C.qX,new E.e42(),C.rE,new E.e43(),C.nf,new E.e44(),C.pO,new E.e45(),C.EI,new E.e46(),C.JB,new E.e47(),C.Uq,new E.e48(),C.A8,new E.e49(),C.Ql,new E.e50(),C.SI,new E.e51(),C.zS,new E.e52(),C.ak,new E.e53(),C.eo,new E.e54(),C.Ge,new E.e55(),C.He,new E.e56(),C.wq,new E.e57(),C.k6,new E.e58(),C.oj,new E.e59(),C.PJ,new E.e60(),C.Ms,new E.e61(),C.q2,new E.e62(),C.d2,new E.e63(),C.kN,new E.e64(),C.fn,new E.e65(),C.eJ,new E.e66(),C.iG,new E.e67(),C.Py,new E.e68(),C.uu,new E.e69(),C.qs,new E.e70(),C.h7,new E.e71(),C.I9,new E.e72(),C.C1,new E.e73(),C.a0,new E.e74(),C.Yg,new E.e75(),C.bR,new E.e76(),C.ai,new E.e77(),C.ob,new E.e78(),C.Iv,new E.e79(),C.Wg,new E.e80(),C.tD,new E.e81(),C.nZ,new E.e82(),C.Of,new E.e83(),C.pY,new E.e84(),C.LA,new E.e85(),C.Lk,new E.e86(),C.dK,new E.e87(),C.xf,new E.e88(),C.rB,new E.e89(),C.bz,new E.e90(),C.Jx,new E.e91(),C.b5,new E.e92(),C.Lc,new E.e93(),C.hf,new E.e94(),C.uk,new E.e95(),C.kA,new E.e96(),C.Wn,new E.e97(),C.ur,new E.e98(),C.VN,new E.e99(),C.EV,new E.e100(),C.VI,new E.e101(),C.eh,new E.e102(),C.SA,new E.e103(),C.kV,new E.e104(),C.vp,new E.e105(),C.cc,new E.e106(),C.DY,new E.e107(),C.Lx,new E.e108(),C.M3,new E.e109(),C.wT,new E.e110(),C.SR,new E.e111(),C.t6,new E.e112(),C.rP,new E.e113(),C.pX,new E.e114(),C.VD,new E.e115(),C.NN,new E.e116(),C.UX,new E.e117(),C.YS,new E.e118(),C.pu,new E.e119(),C.So,new E.e120(),C.EK,new E.e121(),C.td,new E.e122(),C.Gn,new E.e123(),C.zO,new E.e124(),C.eH,new E.e125(),C.ap,new E.e126(),C.Ys,new E.e127(),C.zm,new E.e128(),C.XM,new E.e129(),C.Ic,new E.e130(),C.yG,new E.e131(),C.tW,new E.e132(),C.CG,new E.e133(),C.Wj,new E.e134(),C.vb,new E.e135(),C.UL,new E.e136(),C.AY,new E.e137(),C.QK,new E.e138(),C.AO,new E.e139(),C.I7,new E.e140(),C.xP,new E.e141(),C.Wm,new E.e142(),C.GR,new E.e143(),C.KX,new E.e144(),C.ja,new E.e145(),C.Dj,new E.e146(),C.Gi,new E.e147(),C.yL,new E.e148(),C.ni,new E.e149(),C.X2,new E.e150(),C.F3,new E.e151(),C.UY,new E.e152(),C.Aa,new E.e153(),C.nY,new E.e154(),C.HD,new E.e155(),C.iU,new E.e156(),C.eN,new E.e157(),C.ue,new E.e158(),C.nh,new E.e159(),C.L2,new E.e160(),C.Gs,new E.e161(),C.bE,new E.e162(),C.YD,new E.e163(),C.PX,new E.e164(),C.N8,new E.e165(),C.EA,new E.e166(),C.oW,new E.e167(),C.hd,new E.e168(),C.XY,new E.e169(),C.kz,new E.e170(),C.fV,new E.e171(),C.Ve,new E.e172(),C.jM,new E.e173(),C.DW,new E.e174(),C.PM,new E.e175(),C.Nv,new E.e176(),C.TW,new E.e177(),C.xS,new E.e178(),C.mi,new E.e179(),C.zz,new E.e180(),C.hO,new E.e181(),C.ei,new E.e182(),C.HK,new E.e183(),C.je,new E.e184(),C.hN,new E.e185(),C.Q1,new E.e186(),C.ID,new E.e187(),C.z6,new E.e188(),C.bc,new E.e189(),C.kw,new E.e190(),C.ep,new E.e191(),C.J2,new E.e192(),C.zU,new E.e193(),C.bn,new E.e194(),C.mh,new E.e195(),C.Fh,new E.e196(),C.jh,new E.e197(),C.fj,new E.e198(),C.xw,new E.e199(),C.zn,new E.e200(),C.RJ,new E.e201(),C.Tc,new E.e202(),C.YE,new E.e203(),C.Uy,new E.e204()],null,null)
+y=P.EF([C.aP,new E.e205(),C.cg,new E.e206(),C.j2,new E.e207(),C.S4,new E.e208(),C.AV,new E.e209(),C.bk,new E.e210(),C.lH,new E.e211(),C.kG,new E.e212(),C.XA,new E.e213(),C.i4,new E.e214(),C.bJ,new E.e215(),C.WZ,new E.e216(),C.VK,new E.e217(),C.aH,new E.e218(),C.PI,new E.e219(),C.Gr,new E.e220(),C.tP,new E.e221(),C.yh,new E.e222(),C.Zb,new E.e223(),C.ne,new E.e224(),C.B0,new E.e225(),C.mr,new E.e226(),C.YT,new E.e227(),C.WQ,new E.e228(),C.jU,new E.e229(),C.Gd,new E.e230(),C.OO,new E.e231(),C.Mc,new E.e232(),C.QH,new E.e233(),C.rE,new E.e234(),C.nf,new E.e235(),C.Ql,new E.e236(),C.ak,new E.e237(),C.eo,new E.e238(),C.Ge,new E.e239(),C.He,new E.e240(),C.oj,new E.e241(),C.Ms,new E.e242(),C.d2,new E.e243(),C.fn,new E.e244(),C.Py,new E.e245(),C.uu,new E.e246(),C.qs,new E.e247(),C.a0,new E.e248(),C.rB,new E.e249(),C.Lc,new E.e250(),C.hf,new E.e251(),C.uk,new E.e252(),C.kA,new E.e253(),C.ur,new E.e254(),C.EV,new E.e255(),C.eh,new E.e256(),C.SA,new E.e257(),C.kV,new E.e258(),C.vp,new E.e259(),C.SR,new E.e260(),C.t6,new E.e261(),C.UX,new E.e262(),C.YS,new E.e263(),C.td,new E.e264(),C.zO,new E.e265(),C.Ys,new E.e266(),C.XM,new E.e267(),C.Ic,new E.e268(),C.tW,new E.e269(),C.Wj,new E.e270(),C.vb,new E.e271(),C.QK,new E.e272(),C.AO,new E.e273(),C.xP,new E.e274(),C.GR,new E.e275(),C.KX,new E.e276(),C.ja,new E.e277(),C.Dj,new E.e278(),C.X2,new E.e279(),C.F3,new E.e280(),C.UY,new E.e281(),C.Aa,new E.e282(),C.nY,new E.e283(),C.HD,new E.e284(),C.iU,new E.e285(),C.eN,new E.e286(),C.Gs,new E.e287(),C.bE,new E.e288(),C.YD,new E.e289(),C.PX,new E.e290(),C.XY,new E.e291(),C.fV,new E.e292(),C.Ve,new E.e293(),C.jM,new E.e294(),C.PM,new E.e295(),C.Nv,new E.e296(),C.TW,new E.e297(),C.mi,new E.e298(),C.zz,new E.e299(),C.z6,new E.e300(),C.kw,new E.e301(),C.zU,new E.e302(),C.RJ,new E.e303(),C.YE,new E.e304()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,C.Mt,C.Lg,C.qJ,C.KO,C.Mt,C.wk,C.Mt,C.jA,C.qJ,C.Jo,C.il,C.Az,C.Mt,C.Vx,C.Mt,C.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,C.Mt,C.FG,C.il,C.pJ,C.Mt,C.tU,C.Mt,C.DD,C.Mt,C.Yy,C.il,C.Xv,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.z7,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,C.Mt,C.CT,C.Mt,C.mq,C.Mt,C.Tq,C.Mt,C.lp,C.il,C.PT,C.Mt,C.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.Vx,P.EF([C.OO,C.RM],null,null),C.BL,P.EF([C.Mc,C.XV],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.Ep,P.EF([C.vp,C.K9],null,null),C.dD,P.EF([C.fV,C.CN],null,null),C.hP,P.EF([C.Wj,C.FN],null,null),C.tc,P.EF([C.vp,C.K9],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.v0],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.K9],null,null),C.FG,C.CM,C.pJ,P.EF([C.Ve,C.Gg],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.DD,P.EF([C.vp,C.K9],null,null),C.Yy,C.CM,C.Xv,P.EF([C.YE,C.Xt],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.z7,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.ON,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.R3,"fd",C.WQ,"field",C.jU,"file",C.Gd,"firstTokenPos",C.OO,"flag",C.Mc,"flagList",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.yL,"remoteAddress",C.ni,"remotePort",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",C.HD,"retainedSize",C.iU,"retainingPath",C.eN,"rootLib",C.ue,"row",C.nh,"rows",C.L2,"running",C.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.XY,"showCoverage",C.kz,"showCoverageChanged",C.fV,"small",C.Ve,"socket",C.jM,"socketOwner",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
 $.j8=new O.LT(z,y,C.CM)
 $.Yv=new O.bY(x,w,!1)
 $.qe=v
-$.M6=[new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383()]
+$.M6=[new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376()]
 $.UG=!0
-F.E2()},"$0","vS",0,0,18],
+F.E2()},"$0","vS",0,0,15],
 em:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Jp(a)},
 $isEH:true},
 Lb:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gYu()},
 $isEH:true},
 QA:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ln(a)},
 $isEH:true},
 Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
+"^":"Tp:10;",
+$1:function(a){return J.un(a)},
 $isEH:true},
 ed:{
-"^":"Tp:13;",
-$1:function(a){return J.Im(a)},
+"^":"Tp:10;",
+$1:function(a){return a.gA3()},
 $isEH:true},
 wa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gqr()},
 $isEH:true},
 Or:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.nG(a)},
 $isEH:true},
 YL:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.aA(a)},
 $isEH:true},
 wf:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.WT(a)},
 $isEH:true},
 Oa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Wp(a)},
 $isEH:true},
 emv:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.n9(a)},
 $isEH:true},
 Lbd:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.K0(a)},
 $isEH:true},
 QAa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.hn(a)},
 $isEH:true},
 CvS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yz(a)},
 $isEH:true},
 edy:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.pP(a)},
 $isEH:true},
 waE:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gaP()},
 $isEH:true},
 Ore:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.E3(a)},
 $isEH:true},
 YLa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.on(a)},
 $isEH:true},
 wfa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.SM(a)},
 $isEH:true},
 Oaa:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.goH()},
 $isEH:true},
 e0:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.OT(a)},
 $isEH:true},
 e1:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ok(a)},
 $isEH:true},
 e2:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.wd(a)},
 $isEH:true},
 e3:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.RC(a)},
 $isEH:true},
 e4:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gSL()},
 $isEH:true},
 e5:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.guH()},
 $isEH:true},
 e6:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.mP(a)},
 $isEH:true},
 e7:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.BT(a)},
 $isEH:true},
 e8:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yA(a)},
 $isEH:true},
 e9:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.vi(a)},
 $isEH:true},
 e10:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gFL()},
 $isEH:true},
 e11:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.rw(a)},
 $isEH:true},
 e12:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gw2()},
 $isEH:true},
 e13:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.w8(a)},
 $isEH:true},
 e14:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.is(a)},
 $isEH:true},
 e15:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yi(a)},
 $isEH:true},
 e16:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Vl(a)},
 $isEH:true},
 e17:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.kE(a)},
 $isEH:true},
 e18:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Ak(a)},
 $isEH:true},
 e19:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.Mz(a)},
 $isEH:true},
 e20:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.S9(a)},
 $isEH:true},
 e21:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gty()},
 $isEH:true},
 e22:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.yn(a)},
 $isEH:true},
 e23:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.gkE()},
 $isEH:true},
 e24:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.pm(a)},
 $isEH:true},
 e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
+"^":"Tp:10;",
+$1:function(a){return J.WA(a)},
 $isEH:true},
 e26:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.ghY()},
 $isEH:true},
-e28:{
-"^":"Tp:13;",
+e27:{
+"^":"Tp:10;",
 $1:function(a){return J.ra(a)},
 $isEH:true},
-e29:{
-"^":"Tp:13;",
+e28:{
+"^":"Tp:10;",
 $1:function(a){return J.QZ(a)},
 $isEH:true},
-e30:{
-"^":"Tp:13;",
+e29:{
+"^":"Tp:10;",
 $1:function(a){return J.WX(a)},
 $isEH:true},
-e31:{
-"^":"Tp:13;",
+e30:{
+"^":"Tp:10;",
 $1:function(a){return J.JD(a)},
 $isEH:true},
-e32:{
-"^":"Tp:13;",
+e31:{
+"^":"Tp:10;",
 $1:function(a){return a.gZd()},
 $isEH:true},
-e33:{
-"^":"Tp:13;",
+e32:{
+"^":"Tp:10;",
 $1:function(a){return J.lT(a)},
 $isEH:true},
-e34:{
-"^":"Tp:13;",
+e33:{
+"^":"Tp:10;",
 $1:function(a){return J.M4(a)},
 $isEH:true},
-e35:{
-"^":"Tp:13;",
+e34:{
+"^":"Tp:10;",
 $1:function(a){return a.gkA()},
 $isEH:true},
-e36:{
-"^":"Tp:13;",
+e35:{
+"^":"Tp:10;",
 $1:function(a){return a.gGK()},
 $isEH:true},
-e37:{
-"^":"Tp:13;",
+e36:{
+"^":"Tp:10;",
 $1:function(a){return a.gan()},
 $isEH:true},
-e38:{
-"^":"Tp:13;",
+e37:{
+"^":"Tp:10;",
 $1:function(a){return a.gcQ()},
 $isEH:true},
-e39:{
-"^":"Tp:13;",
+e38:{
+"^":"Tp:10;",
 $1:function(a){return a.gS7()},
 $isEH:true},
-e40:{
-"^":"Tp:13;",
+e39:{
+"^":"Tp:10;",
 $1:function(a){return a.gP3()},
 $isEH:true},
-e41:{
-"^":"Tp:13;",
+e40:{
+"^":"Tp:10;",
 $1:function(a){return J.PY(a)},
 $isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return J.Oq(a)},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
+e41:{
+"^":"Tp:10;",
 $1:function(a){return J.bu(a)},
 $isEH:true},
-e44:{
-"^":"Tp:13;",
+e42:{
+"^":"Tp:10;",
 $1:function(a){return J.VL(a)},
 $isEH:true},
-e45:{
-"^":"Tp:13;",
+e43:{
+"^":"Tp:10;",
 $1:function(a){return J.zN(a)},
 $isEH:true},
-e46:{
-"^":"Tp:13;",
+e44:{
+"^":"Tp:10;",
 $1:function(a){return J.m4(a)},
 $isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
+e45:{
+"^":"Tp:10;",
+$1:function(a){return J.WY(a)},
 $isEH:true},
-e48:{
-"^":"Tp:13;",
+e46:{
+"^":"Tp:10;",
 $1:function(a){return a.gmu()},
 $isEH:true},
-e49:{
-"^":"Tp:13;",
+e47:{
+"^":"Tp:10;",
 $1:function(a){return a.gCO()},
 $isEH:true},
-e50:{
-"^":"Tp:13;",
+e48:{
+"^":"Tp:10;",
 $1:function(a){return a.gwy()},
 $isEH:true},
-e51:{
-"^":"Tp:13;",
+e49:{
+"^":"Tp:10;",
 $1:function(a){return a.gyY()},
 $isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.bL(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
+e50:{
+"^":"Tp:10;",
 $1:function(a){return J.wO(a)},
 $isEH:true},
-e55:{
-"^":"Tp:13;",
+e51:{
+"^":"Tp:10;",
 $1:function(a){return a.gGf()},
 $isEH:true},
-e56:{
-"^":"Tp:13;",
+e52:{
+"^":"Tp:10;",
 $1:function(a){return a.gUa()},
 $isEH:true},
-e57:{
-"^":"Tp:13;",
+e53:{
+"^":"Tp:10;",
 $1:function(a){return J.u1(a)},
 $isEH:true},
-e58:{
-"^":"Tp:13;",
+e54:{
+"^":"Tp:10;",
+$1:function(a){return a.gHP()},
+$isEH:true},
+e55:{
+"^":"Tp:10;",
 $1:function(a){return J.z3(a)},
 $isEH:true},
-e59:{
-"^":"Tp:13;",
+e56:{
+"^":"Tp:10;",
 $1:function(a){return J.YQ(a)},
 $isEH:true},
-e60:{
-"^":"Tp:13;",
+e57:{
+"^":"Tp:10;",
 $1:function(a){return J.Hr(a)},
 $isEH:true},
-e61:{
-"^":"Tp:13;",
+e58:{
+"^":"Tp:10;",
 $1:function(a){return J.fA(a)},
 $isEH:true},
-e62:{
-"^":"Tp:13;",
+e59:{
+"^":"Tp:10;",
 $1:function(a){return J.cd(a)},
 $isEH:true},
-e63:{
-"^":"Tp:13;",
+e60:{
+"^":"Tp:10;",
 $1:function(a){return a.gL4()},
 $isEH:true},
-e64:{
-"^":"Tp:13;",
+e61:{
+"^":"Tp:10;",
 $1:function(a){return J.pB(a)},
 $isEH:true},
-e65:{
-"^":"Tp:13;",
+e62:{
+"^":"Tp:10;",
 $1:function(a){return a.gaj()},
 $isEH:true},
-e66:{
-"^":"Tp:13;",
+e63:{
+"^":"Tp:10;",
 $1:function(a){return a.giq()},
 $isEH:true},
-e67:{
-"^":"Tp:13;",
+e64:{
+"^":"Tp:10;",
 $1:function(a){return a.gBm()},
 $isEH:true},
-e68:{
-"^":"Tp:13;",
+e65:{
+"^":"Tp:10;",
 $1:function(a){return J.xR(a)},
 $isEH:true},
-e69:{
-"^":"Tp:13;",
+e66:{
+"^":"Tp:10;",
 $1:function(a){return a.gNI()},
 $isEH:true},
-e70:{
-"^":"Tp:13;",
+e67:{
+"^":"Tp:10;",
 $1:function(a){return a.gva()},
 $isEH:true},
-e71:{
-"^":"Tp:13;",
+e68:{
+"^":"Tp:10;",
 $1:function(a){return a.gKt()},
 $isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
+e69:{
+"^":"Tp:10;",
 $1:function(a){return J.ns(a)},
 $isEH:true},
-e74:{
-"^":"Tp:13;",
+e70:{
+"^":"Tp:10;",
 $1:function(a){return J.Ew(a)},
 $isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return a.gOj()},
+e71:{
+"^":"Tp:10;",
+$1:function(a){return a.gwg()},
 $isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
+e72:{
+"^":"Tp:10;",
 $1:function(a){return J.Ja(a)},
 $isEH:true},
-e78:{
-"^":"Tp:13;",
+e73:{
+"^":"Tp:10;",
 $1:function(a){return a.gUB()},
 $isEH:true},
-e79:{
-"^":"Tp:13;",
+e74:{
+"^":"Tp:10;",
 $1:function(a){return J.pd(a)},
 $isEH:true},
-e80:{
-"^":"Tp:13;",
+e75:{
+"^":"Tp:10;",
 $1:function(a){return a.gkU()},
 $isEH:true},
-e81:{
-"^":"Tp:13;",
+e76:{
+"^":"Tp:10;",
 $1:function(a){return J.wz(a)},
 $isEH:true},
-e82:{
-"^":"Tp:13;",
+e77:{
+"^":"Tp:10;",
 $1:function(a){return J.tx(a)},
 $isEH:true},
-e83:{
-"^":"Tp:13;",
+e78:{
+"^":"Tp:10;",
 $1:function(a){return J.ls(a)},
 $isEH:true},
-e84:{
-"^":"Tp:13;",
+e79:{
+"^":"Tp:10;",
 $1:function(a){return J.yq(a)},
 $isEH:true},
-e85:{
-"^":"Tp:13;",
+e80:{
+"^":"Tp:10;",
 $1:function(a){return J.SZ(a)},
 $isEH:true},
-e86:{
-"^":"Tp:13;",
+e81:{
+"^":"Tp:10;",
 $1:function(a){return J.DL(a)},
 $isEH:true},
-e87:{
-"^":"Tp:13;",
+e82:{
+"^":"Tp:10;",
 $1:function(a){return J.yx(a)},
 $isEH:true},
-e88:{
-"^":"Tp:13;",
+e83:{
+"^":"Tp:10;",
 $1:function(a){return J.cU(a)},
 $isEH:true},
-e89:{
-"^":"Tp:13;",
+e84:{
+"^":"Tp:10;",
 $1:function(a){return a.gYG()},
 $isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
+e85:{
+"^":"Tp:10;",
 $1:function(a){return a.gHY()},
 $isEH:true},
-e92:{
-"^":"Tp:13;",
+e86:{
+"^":"Tp:10;",
 $1:function(a){return J.UM(a)},
 $isEH:true},
-e93:{
-"^":"Tp:13;",
+e87:{
+"^":"Tp:10;",
 $1:function(a){return J.ZN(a)},
 $isEH:true},
-e94:{
-"^":"Tp:13;",
+e88:{
+"^":"Tp:10;",
 $1:function(a){return J.xa(a)},
 $isEH:true},
-e95:{
-"^":"Tp:13;",
+e89:{
+"^":"Tp:10;",
 $1:function(a){return J.aT(a)},
 $isEH:true},
-e96:{
-"^":"Tp:13;",
+e90:{
+"^":"Tp:10;",
 $1:function(a){return J.hb(a)},
 $isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
+e91:{
+"^":"Tp:10;",
+$1:function(a){return a.gi2()},
 $isEH:true},
-e98:{
-"^":"Tp:13;",
+e92:{
+"^":"Tp:10;",
 $1:function(a){return a.gEB()},
 $isEH:true},
-e99:{
-"^":"Tp:13;",
+e93:{
+"^":"Tp:10;",
 $1:function(a){return J.Iz(a)},
 $isEH:true},
-e100:{
-"^":"Tp:13;",
+e94:{
+"^":"Tp:10;",
 $1:function(a){return J.Q4(a)},
 $isEH:true},
-e101:{
-"^":"Tp:13;",
+e95:{
+"^":"Tp:10;",
 $1:function(a){return J.MQ(a)},
 $isEH:true},
-e102:{
-"^":"Tp:13;",
+e96:{
+"^":"Tp:10;",
 $1:function(a){return a.gSK()},
 $isEH:true},
-e103:{
-"^":"Tp:13;",
+e97:{
+"^":"Tp:10;",
 $1:function(a){return J.q8(a)},
 $isEH:true},
-e104:{
-"^":"Tp:13;",
+e98:{
+"^":"Tp:10;",
 $1:function(a){return a.ghX()},
 $isEH:true},
-e105:{
-"^":"Tp:13;",
+e99:{
+"^":"Tp:10;",
 $1:function(a){return a.gvU()},
 $isEH:true},
-e106:{
-"^":"Tp:13;",
+e100:{
+"^":"Tp:10;",
 $1:function(a){return J.jl(a)},
 $isEH:true},
-e107:{
-"^":"Tp:13;",
+e101:{
+"^":"Tp:10;",
 $1:function(a){return a.gRd()},
 $isEH:true},
-e108:{
-"^":"Tp:13;",
+e102:{
+"^":"Tp:10;",
 $1:function(a){return J.zY(a)},
 $isEH:true},
-e109:{
-"^":"Tp:13;",
+e103:{
+"^":"Tp:10;",
 $1:function(a){return J.de(a)},
 $isEH:true},
-e110:{
-"^":"Tp:13;",
+e104:{
+"^":"Tp:10;",
 $1:function(a){return J.Ds(a)},
 $isEH:true},
-e111:{
-"^":"Tp:13;",
+e105:{
+"^":"Tp:10;",
 $1:function(a){return J.cO(a)},
 $isEH:true},
-e112:{
-"^":"Tp:13;",
+e106:{
+"^":"Tp:10;",
 $1:function(a){return a.gzM()},
 $isEH:true},
-e113:{
-"^":"Tp:13;",
+e107:{
+"^":"Tp:10;",
 $1:function(a){return a.gn0()},
 $isEH:true},
-e114:{
-"^":"Tp:13;",
+e108:{
+"^":"Tp:10;",
 $1:function(a){return a.giP()},
 $isEH:true},
-e115:{
-"^":"Tp:13;",
+e109:{
+"^":"Tp:10;",
 $1:function(a){return a.gLw()},
 $isEH:true},
-e116:{
-"^":"Tp:13;",
+e110:{
+"^":"Tp:10;",
 $1:function(a){return a.geH()},
 $isEH:true},
-e117:{
-"^":"Tp:13;",
+e111:{
+"^":"Tp:10;",
 $1:function(a){return J.Yf(a)},
 $isEH:true},
-e118:{
-"^":"Tp:13;",
+e112:{
+"^":"Tp:10;",
 $1:function(a){return J.kv(a)},
 $isEH:true},
-e119:{
-"^":"Tp:13;",
+e113:{
+"^":"Tp:10;",
 $1:function(a){return J.ih(a)},
 $isEH:true},
-e120:{
-"^":"Tp:13;",
+e114:{
+"^":"Tp:10;",
 $1:function(a){return J.z2(a)},
 $isEH:true},
-e121:{
-"^":"Tp:13;",
+e115:{
+"^":"Tp:10;",
 $1:function(a){return J.ZL(a)},
 $isEH:true},
-e122:{
-"^":"Tp:13;",
+e116:{
+"^":"Tp:10;",
 $1:function(a){return J.ba(a)},
 $isEH:true},
-e123:{
-"^":"Tp:13;",
+e117:{
+"^":"Tp:10;",
 $1:function(a){return J.Zv(a)},
 $isEH:true},
-e124:{
-"^":"Tp:13;",
+e118:{
+"^":"Tp:10;",
 $1:function(a){return J.O6(a)},
 $isEH:true},
-e125:{
-"^":"Tp:13;",
+e119:{
+"^":"Tp:10;",
 $1:function(a){return J.HO(a)},
 $isEH:true},
-e126:{
-"^":"Tp:13;",
+e120:{
+"^":"Tp:10;",
 $1:function(a){return a.gxs()},
 $isEH:true},
-e127:{
-"^":"Tp:13;",
+e121:{
+"^":"Tp:10;",
 $1:function(a){return a.gCi()},
 $isEH:true},
-e128:{
-"^":"Tp:13;",
+e122:{
+"^":"Tp:10;",
 $1:function(a){return J.Jj(a)},
 $isEH:true},
-e129:{
-"^":"Tp:13;",
+e123:{
+"^":"Tp:10;",
 $1:function(a){return J.t8(a)},
 $isEH:true},
-e130:{
-"^":"Tp:13;",
+e124:{
+"^":"Tp:10;",
 $1:function(a){return a.gL1()},
 $isEH:true},
-e131:{
-"^":"Tp:13;",
+e125:{
+"^":"Tp:10;",
 $1:function(a){return a.gQB()},
 $isEH:true},
-e132:{
-"^":"Tp:13;",
+e126:{
+"^":"Tp:10;",
 $1:function(a){return a.guq()},
 $isEH:true},
-e133:{
-"^":"Tp:13;",
+e127:{
+"^":"Tp:10;",
 $1:function(a){return J.EC(a)},
 $isEH:true},
-e134:{
-"^":"Tp:13;",
+e128:{
+"^":"Tp:10;",
 $1:function(a){return J.JG(a)},
 $isEH:true},
-e135:{
-"^":"Tp:13;",
+e129:{
+"^":"Tp:10;",
 $1:function(a){return J.AF(a)},
 $isEH:true},
-e136:{
-"^":"Tp:13;",
+e130:{
+"^":"Tp:10;",
 $1:function(a){return J.LB(a)},
 $isEH:true},
-e137:{
-"^":"Tp:13;",
+e131:{
+"^":"Tp:10;",
 $1:function(a){return J.Kl(a)},
 $isEH:true},
-e138:{
-"^":"Tp:13;",
+e132:{
+"^":"Tp:10;",
 $1:function(a){return J.io(a)},
 $isEH:true},
-e139:{
-"^":"Tp:13;",
+e133:{
+"^":"Tp:10;",
 $1:function(a){return J.fy(a)},
 $isEH:true},
-e140:{
-"^":"Tp:13;",
+e134:{
+"^":"Tp:10;",
 $1:function(a){return J.Qa(a)},
 $isEH:true},
-e141:{
-"^":"Tp:13;",
+e135:{
+"^":"Tp:10;",
 $1:function(a){return J.ks(a)},
 $isEH:true},
-e142:{
-"^":"Tp:13;",
+e136:{
+"^":"Tp:10;",
 $1:function(a){return J.Hf(a)},
 $isEH:true},
-e143:{
-"^":"Tp:13;",
+e137:{
+"^":"Tp:10;",
 $1:function(a){return J.WM(a)},
 $isEH:true},
-e144:{
-"^":"Tp:13;",
+e138:{
+"^":"Tp:10;",
 $1:function(a){return J.Pr(a)},
 $isEH:true},
-e145:{
-"^":"Tp:13;",
+e139:{
+"^":"Tp:10;",
 $1:function(a){return J.Sz(a)},
 $isEH:true},
-e146:{
-"^":"Tp:13;",
+e140:{
+"^":"Tp:10;",
 $1:function(a){return a.gm8()},
 $isEH:true},
-e147:{
-"^":"Tp:13;",
+e141:{
+"^":"Tp:10;",
 $1:function(a){return J.Gc(a)},
 $isEH:true},
-e148:{
-"^":"Tp:13;",
+e142:{
+"^":"Tp:10;",
 $1:function(a){return J.Dd(a)},
 $isEH:true},
-e149:{
-"^":"Tp:13;",
+e143:{
+"^":"Tp:10;",
 $1:function(a){return J.Cm(a)},
 $isEH:true},
-e150:{
-"^":"Tp:13;",
+e144:{
+"^":"Tp:10;",
 $1:function(a){return J.AK(a)},
 $isEH:true},
-e151:{
-"^":"Tp:13;",
+e145:{
+"^":"Tp:10;",
 $1:function(a){return J.tF(a)},
 $isEH:true},
-e152:{
-"^":"Tp:13;",
+e146:{
+"^":"Tp:10;",
 $1:function(a){return J.QX(a)},
 $isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
+e147:{
+"^":"Tp:10;",
+$1:function(a){return a.gw6()},
 $isEH:true},
-e154:{
-"^":"Tp:13;",
+e148:{
+"^":"Tp:10;",
 $1:function(a){return a.gNS()},
 $isEH:true},
-e155:{
-"^":"Tp:13;",
+e149:{
+"^":"Tp:10;",
 $1:function(a){return a.guh()},
 $isEH:true},
-e156:{
-"^":"Tp:13;",
+e150:{
+"^":"Tp:10;",
 $1:function(a){return J.iL(a)},
 $isEH:true},
-e157:{
-"^":"Tp:13;",
+e151:{
+"^":"Tp:10;",
 $1:function(a){return J.jP(a)},
 $isEH:true},
-e158:{
-"^":"Tp:13;",
+e152:{
+"^":"Tp:10;",
 $1:function(a){return J.uW(a)},
 $isEH:true},
-e159:{
-"^":"Tp:13;",
+e153:{
+"^":"Tp:10;",
 $1:function(a){return J.W2(a)},
 $isEH:true},
-e160:{
-"^":"Tp:13;",
+e154:{
+"^":"Tp:10;",
 $1:function(a){return J.UT(a)},
 $isEH:true},
-e161:{
-"^":"Tp:13;",
+e155:{
+"^":"Tp:10;",
 $1:function(a){return J.jH(a)},
 $isEH:true},
-e162:{
-"^":"Tp:13;",
+e156:{
+"^":"Tp:10;",
 $1:function(a){return J.jo(a)},
 $isEH:true},
-e163:{
-"^":"Tp:13;",
+e157:{
+"^":"Tp:10;",
 $1:function(a){return a.gVc()},
 $isEH:true},
-e164:{
-"^":"Tp:13;",
+e158:{
+"^":"Tp:10;",
 $1:function(a){return a.gpF()},
 $isEH:true},
-e165:{
-"^":"Tp:13;",
+e159:{
+"^":"Tp:10;",
 $1:function(a){return J.oL(a)},
 $isEH:true},
-e166:{
-"^":"Tp:13;",
+e160:{
+"^":"Tp:10;",
 $1:function(a){return a.gA6()},
 $isEH:true},
-e167:{
-"^":"Tp:13;",
+e161:{
+"^":"Tp:10;",
 $1:function(a){return J.Ry(a)},
 $isEH:true},
-e168:{
-"^":"Tp:13;",
+e162:{
+"^":"Tp:10;",
 $1:function(a){return J.UP(a)},
 $isEH:true},
-e169:{
-"^":"Tp:13;",
+e163:{
+"^":"Tp:10;",
 $1:function(a){return J.fw(a)},
 $isEH:true},
-e170:{
-"^":"Tp:13;",
+e164:{
+"^":"Tp:10;",
 $1:function(a){return J.zH(a)},
 $isEH:true},
-e171:{
-"^":"Tp:13;",
+e165:{
+"^":"Tp:10;",
 $1:function(a){return J.Vi(a)},
 $isEH:true},
-e172:{
-"^":"Tp:13;",
+e166:{
+"^":"Tp:10;",
 $1:function(a){return a.gXR()},
 $isEH:true},
-e173:{
-"^":"Tp:13;",
+e167:{
+"^":"Tp:10;",
 $1:function(a){return J.P5(a)},
 $isEH:true},
-e174:{
-"^":"Tp:13;",
+e168:{
+"^":"Tp:10;",
 $1:function(a){return a.gzS()},
 $isEH:true},
-e175:{
-"^":"Tp:13;",
+e169:{
+"^":"Tp:10;",
 $1:function(a){return J.iY(a)},
 $isEH:true},
-e176:{
-"^":"Tp:13;",
+e170:{
+"^":"Tp:10;",
 $1:function(a){return J.u9(a)},
 $isEH:true},
-e177:{
-"^":"Tp:13;",
+e171:{
+"^":"Tp:10;",
 $1:function(a){return J.U8(a)},
 $isEH:true},
-e178:{
-"^":"Tp:13;",
+e172:{
+"^":"Tp:10;",
 $1:function(a){return J.oN(a)},
 $isEH:true},
-e179:{
-"^":"Tp:13;",
+e173:{
+"^":"Tp:10;",
 $1:function(a){return a.gV8()},
 $isEH:true},
-e180:{
-"^":"Tp:13;",
+e174:{
+"^":"Tp:10;",
 $1:function(a){return a.gGD()},
 $isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
+e175:{
+"^":"Tp:10;",
+$1:function(a){return J.Td(a)},
 $isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
+e176:{
+"^":"Tp:10;",
 $1:function(a){return a.gDo()},
 $isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
+e177:{
+"^":"Tp:10;",
 $1:function(a){return J.j1(a)},
 $isEH:true},
-e186:{
-"^":"Tp:13;",
+e178:{
+"^":"Tp:10;",
 $1:function(a){return J.Aw(a)},
 $isEH:true},
-e187:{
-"^":"Tp:13;",
+e179:{
+"^":"Tp:10;",
 $1:function(a){return J.dY(a)},
 $isEH:true},
-e188:{
-"^":"Tp:13;",
+e180:{
+"^":"Tp:10;",
 $1:function(a){return J.OL(a)},
 $isEH:true},
-e189:{
-"^":"Tp:13;",
+e181:{
+"^":"Tp:10;",
 $1:function(a){return a.gki()},
 $isEH:true},
-e190:{
-"^":"Tp:13;",
+e182:{
+"^":"Tp:10;",
 $1:function(a){return a.gZn()},
 $isEH:true},
-e191:{
-"^":"Tp:13;",
+e183:{
+"^":"Tp:10;",
 $1:function(a){return a.gvs()},
 $isEH:true},
-e192:{
-"^":"Tp:13;",
+e184:{
+"^":"Tp:10;",
 $1:function(a){return a.gVh()},
 $isEH:true},
-e193:{
-"^":"Tp:13;",
+e185:{
+"^":"Tp:10;",
 $1:function(a){return a.gZX()},
 $isEH:true},
-e194:{
-"^":"Tp:13;",
+e186:{
+"^":"Tp:10;",
 $1:function(a){return J.SG(a)},
 $isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
+e187:{
+"^":"Tp:10;",
+$1:function(a){return J.eU(a)},
 $isEH:true},
-e196:{
-"^":"Tp:13;",
+e188:{
+"^":"Tp:10;",
 $1:function(a){return a.gVF()},
 $isEH:true},
-e197:{
-"^":"Tp:13;",
+e189:{
+"^":"Tp:10;",
 $1:function(a){return a.gkw()},
 $isEH:true},
-e198:{
-"^":"Tp:13;",
+e190:{
+"^":"Tp:10;",
 $1:function(a){return J.K2(a)},
 $isEH:true},
-e199:{
-"^":"Tp:13;",
+e191:{
+"^":"Tp:10;",
 $1:function(a){return J.uy(a)},
 $isEH:true},
-e200:{
-"^":"Tp:13;",
+e192:{
+"^":"Tp:10;",
 $1:function(a){return a.gEy()},
 $isEH:true},
-e201:{
-"^":"Tp:13;",
+e193:{
+"^":"Tp:10;",
 $1:function(a){return J.Kd(a)},
 $isEH:true},
-e202:{
-"^":"Tp:13;",
+e194:{
+"^":"Tp:10;",
 $1:function(a){return J.Sl(a)},
 $isEH:true},
-e203:{
-"^":"Tp:13;",
+e195:{
+"^":"Tp:10;",
 $1:function(a){return a.gJk()},
 $isEH:true},
-e204:{
-"^":"Tp:13;",
+e196:{
+"^":"Tp:10;",
 $1:function(a){return J.Nl(a)},
 $isEH:true},
-e205:{
-"^":"Tp:13;",
+e197:{
+"^":"Tp:10;",
 $1:function(a){return a.gFc()},
 $isEH:true},
-e206:{
-"^":"Tp:13;",
+e198:{
+"^":"Tp:10;",
 $1:function(a){return a.gYY()},
 $isEH:true},
-e207:{
-"^":"Tp:13;",
+e199:{
+"^":"Tp:10;",
 $1:function(a){return a.gZ3()},
 $isEH:true},
-e208:{
-"^":"Tp:13;",
+e200:{
+"^":"Tp:10;",
 $1:function(a){return a.gYe()},
 $isEH:true},
-e209:{
-"^":"Tp:13;",
+e201:{
+"^":"Tp:10;",
 $1:function(a){return J.I2(a)},
 $isEH:true},
-e210:{
-"^":"Tp:13;",
+e202:{
+"^":"Tp:10;",
 $1:function(a){return a.gzz()},
 $isEH:true},
-e211:{
-"^":"Tp:13;",
+e203:{
+"^":"Tp:10;",
 $1:function(a){return J.tp(a)},
 $isEH:true},
-e212:{
-"^":"Tp:13;",
+e204:{
+"^":"Tp:10;",
 $1:function(a){return a.gaU()},
 $isEH:true},
-e213:{
-"^":"Tp:75;",
+e205:{
+"^":"Tp:69;",
 $2:function(a,b){J.RX(a,b)},
 $isEH:true},
-e214:{
-"^":"Tp:75;",
+e206:{
+"^":"Tp:69;",
 $2:function(a,b){J.a8(a,b)},
 $isEH:true},
-e215:{
-"^":"Tp:75;",
+e207:{
+"^":"Tp:69;",
+$2:function(a,b){J.oO(a,b)},
+$isEH:true},
+e208:{
+"^":"Tp:69;",
 $2:function(a,b){J.l7(a,b)},
 $isEH:true},
-e216:{
-"^":"Tp:75;",
+e209:{
+"^":"Tp:69;",
 $2:function(a,b){J.kB(a,b)},
 $isEH:true},
-e217:{
-"^":"Tp:75;",
+e210:{
+"^":"Tp:69;",
 $2:function(a,b){J.Ae(a,b)},
 $isEH:true},
-e218:{
-"^":"Tp:75;",
+e211:{
+"^":"Tp:69;",
 $2:function(a,b){J.IX(a,b)},
 $isEH:true},
-e219:{
-"^":"Tp:75;",
+e212:{
+"^":"Tp:69;",
 $2:function(a,b){J.WI(a,b)},
 $isEH:true},
-e220:{
-"^":"Tp:75;",
+e213:{
+"^":"Tp:69;",
 $2:function(a,b){J.o0(a,b)},
 $isEH:true},
-e221:{
-"^":"Tp:75;",
-$2:function(a,b){J.T5(a,b)},
+e214:{
+"^":"Tp:69;",
+$2:function(a,b){J.fH(a,b)},
 $isEH:true},
-e222:{
-"^":"Tp:75;",
+e215:{
+"^":"Tp:69;",
 $2:function(a,b){J.Sf(a,b)},
 $isEH:true},
-e223:{
-"^":"Tp:75;",
+e216:{
+"^":"Tp:69;",
 $2:function(a,b){J.qA(a,b)},
 $isEH:true},
-e224:{
-"^":"Tp:75;",
+e217:{
+"^":"Tp:69;",
 $2:function(a,b){J.LM(a,b)},
 $isEH:true},
-e225:{
-"^":"Tp:75;",
+e218:{
+"^":"Tp:69;",
 $2:function(a,b){J.qq(a,b)},
 $isEH:true},
-e226:{
-"^":"Tp:75;",
+e219:{
+"^":"Tp:69;",
 $2:function(a,b){J.Pk(a,b)},
 $isEH:true},
-e227:{
-"^":"Tp:75;",
+e220:{
+"^":"Tp:69;",
 $2:function(a,b){J.Yz(a,b)},
 $isEH:true},
-e228:{
-"^":"Tp:75;",
+e221:{
+"^":"Tp:69;",
 $2:function(a,b){a.sw2(b)},
 $isEH:true},
-e229:{
-"^":"Tp:75;",
+e222:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qr(a,b)},
 $isEH:true},
-e230:{
-"^":"Tp:75;",
+e223:{
+"^":"Tp:69;",
 $2:function(a,b){J.xW(a,b)},
 $isEH:true},
-e231:{
-"^":"Tp:75;",
+e224:{
+"^":"Tp:69;",
 $2:function(a,b){J.BC(a,b)},
 $isEH:true},
-e232:{
-"^":"Tp:75;",
+e225:{
+"^":"Tp:69;",
 $2:function(a,b){J.VJ(a,b)},
 $isEH:true},
-e233:{
-"^":"Tp:75;",
+e226:{
+"^":"Tp:69;",
 $2:function(a,b){J.NO(a,b)},
 $isEH:true},
-e234:{
-"^":"Tp:75;",
+e227:{
+"^":"Tp:69;",
 $2:function(a,b){J.WB(a,b)},
 $isEH:true},
-e235:{
-"^":"Tp:75;",
+e228:{
+"^":"Tp:69;",
 $2:function(a,b){J.JZ(a,b)},
 $isEH:true},
-e236:{
-"^":"Tp:75;",
+e229:{
+"^":"Tp:69;",
 $2:function(a,b){J.fR(a,b)},
 $isEH:true},
-e237:{
-"^":"Tp:75;",
+e230:{
+"^":"Tp:69;",
 $2:function(a,b){a.shY(b)},
 $isEH:true},
-e238:{
-"^":"Tp:75;",
+e231:{
+"^":"Tp:69;",
 $2:function(a,b){J.LP(a,b)},
 $isEH:true},
-e239:{
-"^":"Tp:75;",
+e232:{
+"^":"Tp:69;",
 $2:function(a,b){J.GF(a,b)},
 $isEH:true},
-e240:{
-"^":"Tp:75;",
+e233:{
+"^":"Tp:69;",
 $2:function(a,b){J.Nf(a,b)},
 $isEH:true},
-e241:{
-"^":"Tp:75;",
+e234:{
+"^":"Tp:69;",
 $2:function(a,b){J.Pl(a,b)},
 $isEH:true},
-e242:{
-"^":"Tp:75;",
+e235:{
+"^":"Tp:69;",
 $2:function(a,b){J.C3(a,b)},
 $isEH:true},
-e243:{
-"^":"Tp:75;",
+e236:{
+"^":"Tp:69;",
 $2:function(a,b){J.xH(a,b)},
 $isEH:true},
-e244:{
-"^":"Tp:75;",
+e237:{
+"^":"Tp:69;",
 $2:function(a,b){J.Nh(a,b)},
 $isEH:true},
-e245:{
-"^":"Tp:75;",
+e238:{
+"^":"Tp:69;",
+$2:function(a,b){a.sHP(b)},
+$isEH:true},
+e239:{
+"^":"Tp:69;",
 $2:function(a,b){J.AI(a,b)},
 $isEH:true},
-e246:{
-"^":"Tp:75;",
+e240:{
+"^":"Tp:69;",
 $2:function(a,b){J.nA(a,b)},
 $isEH:true},
-e247:{
-"^":"Tp:75;",
+e241:{
+"^":"Tp:69;",
 $2:function(a,b){J.fb(a,b)},
 $isEH:true},
-e248:{
-"^":"Tp:75;",
+e242:{
+"^":"Tp:69;",
 $2:function(a,b){J.tv(a,b)},
 $isEH:true},
-e249:{
-"^":"Tp:75;",
+e243:{
+"^":"Tp:69;",
 $2:function(a,b){a.siq(b)},
 $isEH:true},
-e250:{
-"^":"Tp:75;",
+e244:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qy(a,b)},
 $isEH:true},
-e251:{
-"^":"Tp:75;",
+e245:{
+"^":"Tp:69;",
 $2:function(a,b){a.sKt(b)},
 $isEH:true},
-e252:{
-"^":"Tp:75;",
+e246:{
+"^":"Tp:69;",
 $2:function(a,b){J.Oo(a,b)},
 $isEH:true},
-e253:{
-"^":"Tp:75;",
+e247:{
+"^":"Tp:69;",
 $2:function(a,b){J.mU(a,b)},
 $isEH:true},
-e254:{
-"^":"Tp:75;",
+e248:{
+"^":"Tp:69;",
 $2:function(a,b){J.Kz(a,b)},
 $isEH:true},
-e255:{
-"^":"Tp:75;",
+e249:{
+"^":"Tp:69;",
 $2:function(a,b){J.uM(a,b)},
 $isEH:true},
-e256:{
-"^":"Tp:75;",
+e250:{
+"^":"Tp:69;",
 $2:function(a,b){J.Er(a,b)},
 $isEH:true},
-e257:{
-"^":"Tp:75;",
+e251:{
+"^":"Tp:69;",
 $2:function(a,b){J.uX(a,b)},
 $isEH:true},
-e258:{
-"^":"Tp:75;",
+e252:{
+"^":"Tp:69;",
 $2:function(a,b){J.hS(a,b)},
 $isEH:true},
-e259:{
-"^":"Tp:75;",
+e253:{
+"^":"Tp:69;",
 $2:function(a,b){a.sSK(b)},
 $isEH:true},
-e260:{
-"^":"Tp:75;",
+e254:{
+"^":"Tp:69;",
 $2:function(a,b){a.shX(b)},
 $isEH:true},
-e261:{
-"^":"Tp:75;",
+e255:{
+"^":"Tp:69;",
 $2:function(a,b){J.cl(a,b)},
 $isEH:true},
-e262:{
-"^":"Tp:75;",
+e256:{
+"^":"Tp:69;",
 $2:function(a,b){J.Jb(a,b)},
 $isEH:true},
-e263:{
-"^":"Tp:75;",
+e257:{
+"^":"Tp:69;",
 $2:function(a,b){J.k7(a,b)},
 $isEH:true},
-e264:{
-"^":"Tp:75;",
+e258:{
+"^":"Tp:69;",
 $2:function(a,b){J.MX(a,b)},
 $isEH:true},
-e265:{
-"^":"Tp:75;",
+e259:{
+"^":"Tp:69;",
 $2:function(a,b){J.A4(a,b)},
 $isEH:true},
-e266:{
-"^":"Tp:75;",
+e260:{
+"^":"Tp:69;",
 $2:function(a,b){J.wD(a,b)},
 $isEH:true},
-e267:{
-"^":"Tp:75;",
+e261:{
+"^":"Tp:69;",
 $2:function(a,b){J.wJ(a,b)},
 $isEH:true},
-e268:{
-"^":"Tp:75;",
+e262:{
+"^":"Tp:69;",
 $2:function(a,b){J.oJ(a,b)},
 $isEH:true},
-e269:{
-"^":"Tp:75;",
+e263:{
+"^":"Tp:69;",
 $2:function(a,b){J.DF(a,b)},
 $isEH:true},
-e270:{
-"^":"Tp:75;",
+e264:{
+"^":"Tp:69;",
 $2:function(a,b){J.Mi(a,b)},
 $isEH:true},
-e271:{
-"^":"Tp:75;",
+e265:{
+"^":"Tp:69;",
 $2:function(a,b){a.sL1(b)},
 $isEH:true},
-e272:{
-"^":"Tp:75;",
+e266:{
+"^":"Tp:69;",
 $2:function(a,b){J.XF(a,b)},
 $isEH:true},
-e273:{
-"^":"Tp:75;",
+e267:{
+"^":"Tp:69;",
 $2:function(a,b){J.SF(a,b)},
 $isEH:true},
-e274:{
-"^":"Tp:75;",
+e268:{
+"^":"Tp:69;",
 $2:function(a,b){J.Qv(a,b)},
 $isEH:true},
-e275:{
-"^":"Tp:75;",
+e269:{
+"^":"Tp:69;",
 $2:function(a,b){J.Xg(a,b)},
 $isEH:true},
-e276:{
-"^":"Tp:75;",
+e270:{
+"^":"Tp:69;",
 $2:function(a,b){J.aw(a,b)},
 $isEH:true},
-e277:{
-"^":"Tp:75;",
+e271:{
+"^":"Tp:69;",
 $2:function(a,b){J.CJ(a,b)},
 $isEH:true},
-e278:{
-"^":"Tp:75;",
+e272:{
+"^":"Tp:69;",
 $2:function(a,b){J.P2(a,b)},
 $isEH:true},
-e279:{
-"^":"Tp:75;",
+e273:{
+"^":"Tp:69;",
 $2:function(a,b){J.fv(a,b)},
 $isEH:true},
-e280:{
-"^":"Tp:75;",
+e274:{
+"^":"Tp:69;",
 $2:function(a,b){J.PP(a,b)},
 $isEH:true},
-e281:{
-"^":"Tp:75;",
+e275:{
+"^":"Tp:69;",
 $2:function(a,b){J.Sj(a,b)},
 $isEH:true},
-e282:{
-"^":"Tp:75;",
+e276:{
+"^":"Tp:69;",
 $2:function(a,b){J.AJ(a,b)},
 $isEH:true},
-e283:{
-"^":"Tp:75;",
+e277:{
+"^":"Tp:69;",
 $2:function(a,b){J.w7(a,b)},
 $isEH:true},
-e284:{
-"^":"Tp:75;",
+e278:{
+"^":"Tp:69;",
 $2:function(a,b){J.ME(a,b)},
 $isEH:true},
-e285:{
-"^":"Tp:75;",
+e279:{
+"^":"Tp:69;",
 $2:function(a,b){J.kX(a,b)},
 $isEH:true},
-e286:{
-"^":"Tp:75;",
+e280:{
+"^":"Tp:69;",
+$2:function(a,b){J.S5(a,b)},
+$isEH:true},
+e281:{
+"^":"Tp:69;",
 $2:function(a,b){J.q0(a,b)},
 $isEH:true},
-e287:{
-"^":"Tp:75;",
+e282:{
+"^":"Tp:69;",
 $2:function(a,b){J.EJ(a,b)},
 $isEH:true},
-e288:{
-"^":"Tp:75;",
+e283:{
+"^":"Tp:69;",
 $2:function(a,b){J.iH(a,b)},
 $isEH:true},
-e289:{
-"^":"Tp:75;",
+e284:{
+"^":"Tp:69;",
 $2:function(a,b){J.B9(a,b)},
 $isEH:true},
-e290:{
-"^":"Tp:75;",
+e285:{
+"^":"Tp:69;",
 $2:function(a,b){J.PN(a,b)},
 $isEH:true},
-e291:{
-"^":"Tp:75;",
+e286:{
+"^":"Tp:69;",
 $2:function(a,b){a.sVc(b)},
 $isEH:true},
-e292:{
-"^":"Tp:75;",
+e287:{
+"^":"Tp:69;",
 $2:function(a,b){J.By(a,b)},
 $isEH:true},
-e293:{
-"^":"Tp:75;",
+e288:{
+"^":"Tp:69;",
 $2:function(a,b){J.jd(a,b)},
 $isEH:true},
-e294:{
-"^":"Tp:75;",
+e289:{
+"^":"Tp:69;",
 $2:function(a,b){J.Rx(a,b)},
 $isEH:true},
-e295:{
-"^":"Tp:75;",
+e290:{
+"^":"Tp:69;",
 $2:function(a,b){J.ZI(a,b)},
 $isEH:true},
-e296:{
-"^":"Tp:75;",
+e291:{
+"^":"Tp:69;",
 $2:function(a,b){J.wg(a,b)},
 $isEH:true},
-e297:{
-"^":"Tp:75;",
+e292:{
+"^":"Tp:69;",
 $2:function(a,b){J.fa(a,b)},
 $isEH:true},
-e298:{
-"^":"Tp:75;",
+e293:{
+"^":"Tp:69;",
 $2:function(a,b){J.Cu(a,b)},
 $isEH:true},
-e299:{
-"^":"Tp:75;",
+e294:{
+"^":"Tp:69;",
 $2:function(a,b){a.sV8(b)},
 $isEH:true},
-e300:{
-"^":"Tp:75;",
+e295:{
+"^":"Tp:69;",
 $2:function(a,b){J.Tx(a,b)},
 $isEH:true},
-e301:{
-"^":"Tp:75;",
+e296:{
+"^":"Tp:69;",
 $2:function(a,b){a.sDo(b)},
 $isEH:true},
-e302:{
-"^":"Tp:75;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e303:{
-"^":"Tp:75;",
+e297:{
+"^":"Tp:69;",
 $2:function(a,b){J.H3(a,b)},
 $isEH:true},
-e304:{
-"^":"Tp:75;",
+e298:{
+"^":"Tp:69;",
 $2:function(a,b){J.t3(a,b)},
 $isEH:true},
-e305:{
-"^":"Tp:75;",
+e299:{
+"^":"Tp:69;",
 $2:function(a,b){J.GT(a,b)},
 $isEH:true},
-e306:{
-"^":"Tp:75;",
+e300:{
+"^":"Tp:69;",
 $2:function(a,b){a.sVF(b)},
 $isEH:true},
-e307:{
-"^":"Tp:75;",
+e301:{
+"^":"Tp:69;",
 $2:function(a,b){J.yO(a,b)},
 $isEH:true},
-e308:{
-"^":"Tp:75;",
+e302:{
+"^":"Tp:69;",
 $2:function(a,b){J.ZU(a,b)},
 $isEH:true},
-e309:{
-"^":"Tp:75;",
-$2:function(a,b){J.rY(a,b)},
+e303:{
+"^":"Tp:69;",
+$2:function(a,b){J.tQ(a,b)},
 $isEH:true},
-e310:{
-"^":"Tp:75;",
+e304:{
+"^":"Tp:69;",
 $2:function(a,b){J.tH(a,b)},
 $isEH:true},
-e311:{
-"^":"Tp:69;",
+e305:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e312:{
-"^":"Tp:69;",
+e306:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e313:{
-"^":"Tp:69;",
+e307:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e314:{
-"^":"Tp:69;",
+e308:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e315:{
-"^":"Tp:69;",
+e309:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e316:{
-"^":"Tp:69;",
+e310:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e317:{
-"^":"Tp:69;",
+e311:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e318:{
-"^":"Tp:69;",
+e312:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e319:{
-"^":"Tp:69;",
+e313:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
+e314:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e322:{
-"^":"Tp:69;",
+e315:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e323:{
-"^":"Tp:69;",
+e316:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e324:{
-"^":"Tp:69;",
+e317:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e325:{
-"^":"Tp:69;",
+e318:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e326:{
-"^":"Tp:69;",
+e319:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
+e320:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e329:{
-"^":"Tp:69;",
+e321:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e330:{
-"^":"Tp:69;",
+e322:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e331:{
-"^":"Tp:69;",
+e323:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e332:{
-"^":"Tp:69;",
+e324:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e333:{
-"^":"Tp:69;",
+e325:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e334:{
-"^":"Tp:69;",
+e326:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e335:{
-"^":"Tp:69;",
+e327:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e336:{
-"^":"Tp:69;",
+e328:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e337:{
-"^":"Tp:69;",
+e329:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e338:{
-"^":"Tp:69;",
+e330:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e339:{
-"^":"Tp:69;",
+e331:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e340:{
-"^":"Tp:69;",
+e332:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e341:{
-"^":"Tp:69;",
+e333:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e342:{
-"^":"Tp:69;",
+e334:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e343:{
-"^":"Tp:69;",
+e335:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e344:{
-"^":"Tp:69;",
+e336:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e345:{
-"^":"Tp:69;",
+e337:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e346:{
-"^":"Tp:69;",
+e338:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e347:{
-"^":"Tp:69;",
+e339:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e348:{
-"^":"Tp:69;",
+e340:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e349:{
-"^":"Tp:69;",
+e341:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e350:{
-"^":"Tp:69;",
+e342:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e351:{
-"^":"Tp:69;",
+e343:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e352:{
-"^":"Tp:69;",
+e344:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e353:{
-"^":"Tp:69;",
+e345:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e354:{
-"^":"Tp:69;",
+e346:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e355:{
-"^":"Tp:69;",
+e347:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e356:{
-"^":"Tp:69;",
+e348:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e357:{
-"^":"Tp:69;",
+e349:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e358:{
-"^":"Tp:69;",
+e350:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e359:{
-"^":"Tp:69;",
+e351:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e360:{
-"^":"Tp:69;",
+e352:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e361:{
-"^":"Tp:69;",
+e353:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e362:{
-"^":"Tp:69;",
+e354:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e363:{
-"^":"Tp:69;",
+e355:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e364:{
-"^":"Tp:69;",
+e356:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e365:{
-"^":"Tp:69;",
+e357:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e366:{
-"^":"Tp:69;",
+e358:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e367:{
-"^":"Tp:69;",
+e359:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e368:{
-"^":"Tp:69;",
+e360:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-counter-chart",C.z7)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e369:{
-"^":"Tp:69;",
+e361:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
+e362:{
+"^":"Tp:66;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e371:{
-"^":"Tp:69;",
+e363:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e372:{
-"^":"Tp:69;",
+e364:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e373:{
-"^":"Tp:69;",
+e365:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e374:{
-"^":"Tp:69;",
+e366:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e375:{
-"^":"Tp:69;",
+e367:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e376:{
-"^":"Tp:69;",
+e368:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e377:{
-"^":"Tp:69;",
+e369:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e378:{
-"^":"Tp:69;",
+e370:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e379:{
-"^":"Tp:69;",
+e371:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e380:{
-"^":"Tp:69;",
+e372:{
+"^":"Tp:66;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e373:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e381:{
-"^":"Tp:69;",
+e374:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e382:{
-"^":"Tp:69;",
+e375:{
+"^":"Tp:66;",
 $0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
 $isEH:true},
-e383:{
-"^":"Tp:69;",
+e376:{
+"^":"Tp:66;",
 $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,{
 "^":"",
@@ -4074,8 +3916,8 @@
 "^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grs:function(a){return a.BW},
 srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,20,91],
-static:{Dw:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,17,84],
+static:{KU:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -4084,8 +3926,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.C8.ZL(a)
-C.C8.XI(a)
+C.J0.ZL(a)
+C.J0.XI(a)
 return a}}},
 Vf:{
 "^":"uL+Pi;",
@@ -4105,93 +3947,16 @@
 a.LL=w
 C.YZz.ZL(a)
 C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-TY:{
-"^":"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.TY(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,a6,nh,q9,YE,JB,on,BA,LL",
-god:function(a){return a.CA},
-sod:function(a,b){a.CA=this.ct(a,C.rB,a.CA,b)},
-q0:function(a){var z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-z=a.CA
-if(z!=null)this.hP(a,z.gDZ())},
-Wt:[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.TY(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.TY(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.WT),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,92,88],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,92,88],
-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,x,w
-z=$.XZ()
-y=P.YM(null,null,null,P.qU,W.I0)
-x=P.qU
-w=W.h4
-w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.on=z
-a.BA=y
-a.LL=w
-C.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,{
+return a}}}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 aC:{
-"^":"Dsd;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Vfx;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.yB},
 sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,97,99],
-RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,20,91],
-static:{lW:function(a){var z,y,x,w
+vV:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,85,86],
+S1:[function(a,b){return J.aT(a.yB).cv(J.ew(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,85,87],
+RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,17,84],
+static:{zg:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -4203,7 +3968,7 @@
 C.ka.ZL(a)
 C.ka.XI(a)
 return a}}},
-Dsd:{
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
@@ -4211,7 +3976,7 @@
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.tY},
 Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.i4,0,1)},"$1","gLe",2,0,13,57],
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,54],
 static:{On:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4227,7 +3992,7 @@
 return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Dsd;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtT:function(a){return a.Xx},
 stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
 q0:function(a){var z
@@ -4235,7 +4000,7 @@
 z=a.Xx
 if(z==null)return
 J.SK(z).ml(new F.aa())},
-RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,17,84],
 m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
@@ -4245,10 +4010,10 @@
 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,100,1,94,95],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,88,1,89,90],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,100,1,94,95],
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,88,1,89,90],
 static:{f9:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4261,16 +4026,16 @@
 C.ux.ZL(a)
 C.ux.XI(a)
 return a}}},
-tuj:{
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
 aa:{
-"^":"Tp:101;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,80,"call"],
+"^":"Tp:91;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,74,"call"],
 $isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":"Vct;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"tuj;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gDX:function(a){return a.Xf},
 sDX:function(a,b){a.Xf=this.ct(a,C.Ms,a.Xf,b)},
 gvu:function(a){return a.VA},
@@ -4296,7 +4061,7 @@
 C.T0.ZL(a)
 C.T0.XI(a)
 return a}}},
-Vct:{
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
@@ -4313,15 +4078,15 @@
 git:function(a){return a.oM},
 sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
 na:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,20,57],
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,54],
 Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,15],
 AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
 if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,79,46,47,80],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,73,43,44,74],
 static:{U9:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -4339,12 +4104,12 @@
 C.O0.XI(a)
 return a}}},
 Xfs:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
 bQ:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
+qo:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
 return!1},
 n3:function(a,b,c){var z
@@ -4383,7 +4148,7 @@
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.ew(b,1)
 C.Nm.u(a,b,v)}},
-Lm:function(a,b,c){var z,y
+aB:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 for(z=J.mY(c);z.G();b=y){y=b+1
 C.Nm.u(a,b,z.gl())}},
@@ -4405,7 +4170,7 @@
 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)},
+else H.d4(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
@@ -4413,7 +4178,7 @@
 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
+d4: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
@@ -4548,7 +4313,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"aL")},31],
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},28],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -4564,7 +4329,7 @@
 z[x]=y;++x}return z},
 br:function(a){return this.tt(a,!0)},
 $isyN:true},
-bX:{
+nH:{
 "^":"aL;l6,SH,AN",
 gMa:function(){var z,y
 z=J.q8(this.l6)
@@ -4603,7 +4368,7 @@
 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:{j5:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
+static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -4687,7 +4452,7 @@
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-h5:{
+Lj:{
 "^":"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"))},
@@ -4732,16 +4497,16 @@
 x=y.gB(z)
 if(typeof b!=="number")return H.s(b)
 return y.Zv(z,x-1-b)}},
-IN:{
+GD:{
 "^":"a;fN<",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
+return!!J.x(b).$isGD&&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,
+$isIN:true,
 static:{"^":"RWj,ES1,quP,KGP,q3,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
 kU:function(a){var z=H.VM(function(b,c){var y=[]
@@ -4752,55 +4517,36 @@
 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],
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,16],
+Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,16],
 VH:function(a,b){var z=H.G3()
-z=H.fH(z,[z,z]).BD(a)
+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.cH(C.ny,new P.w4(a,z))
+P.ww(C.ny,new P.w4(a,z))
 return z},
-hz: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.PG(C.xD,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())
+$.ej().$1(P.rh())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
+throw z}},"$0","rh",0,0,15],
 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)
+$.ej().$1(P.rh())}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
@@ -4815,22 +4561,20 @@
 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],
+SN:[function(a){},"$1","Ax",2,0,17,18],
+vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,19,20,21,22],
+p0:[function(){},"$0","od",0,0,15],
 FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.wM(new P.dR(b,c,d))
-else b.K5(c,d)},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
 TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.wM(new P.Q0(b,c))
-else b.rX(c)},
-cH:function(a,b){var z
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
+ww:function(a,b){var z
 if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
 return z.uN(a,z.xi(b,!0))},
@@ -4839,35 +4583,35 @@
 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],
+CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,23,24,25,26,21,22],
 T8:[function(a,b,c,d){var z,y
 if(J.xC($.X3,c))return d.$0()
 z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
-yv:[function(a,b,c,d,e){var z,y
+return y}finally{$.X3=z}},"$4","lw",8,0,27,24,25,26,28],
+V7:[function(a,b,c,d,e){var z,y
 if(J.xC($.X3,c))return d.$1(e)
 z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","Un",10,0,32,27,28,29,31,33],
+return y}finally{$.X3=z}},"$5","MM",10,0,29,24,25,26,28,30],
 Mu:[function(a,b,c,d,e,f){var z,y
 if(J.xC($.X3,c))return d.$2(e,f)
 z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$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],
+return y}finally{$.X3=z}},"$6","iy",12,0,31,24,25,26,28,6,7],
+Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,32,24,25,26,28],
+cQ:[function(a,b,c,d){return d},"$4","zi",8,0,33,24,25,26,28],
+dL:[function(a,b,c,d){return d},"$4","v3",8,0,34,24,25,26,28],
+Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,35],
+h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,36,24,25,26,37,38],
+XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,39],
+CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,40],
 UA:[function(a,b,c,d,e){var z
 $.oK=P.jt()
 z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Is",10,0,44],
+return new P.uo(c,d,z)},"$5","Is",10,0,41],
 C6:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
@@ -4877,7 +4621,7 @@
 Ik:{
 "^":"O9;Y8"},
 LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
+"^":"Bx;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,nb",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4894,10 +4638,10 @@
 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],
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 static:{"^":"E2b,H6,id"}},
-Ks:{
+WV:{
 "^":"a;iE@,SJ@",
 gUF:function(){return!1},
 im:function(){var z=this.yx
@@ -4912,36 +4656,16 @@
 y.sSJ(z)
 a.sSJ(a)
 a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.to($.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.IG(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},102],
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},92],
 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,103,23,24,25],
+this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,93,20,21,22],
 S6:function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.yx
@@ -4956,7 +4680,7 @@
 this.WX=null
 this.Gv&=4294967287
 C.jN.tZ(z)},
-Qz:function(a){var z,y,x,w
+nE: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
@@ -4979,17 +4703,17 @@
 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",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
 this.iE.Rg(a)
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
-return}this.Qz(new P.tK(this,a))},
+return}this.nE(new P.tK(this,a))},
 pb:function(a,b){if(this.iE===this)return
-this.Qz(new P.OR(this,a,b))},
-Pl:function(){if(this.iE!==this)this.Qz(new P.eB(this))
+this.nE(new P.OR(this,a,b))},
+Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
 else this.yx.OH(null)}},
 tK:{
 "^":"Tp;a,b",
@@ -5007,51 +4731,27 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.LR,a]]}},this.a,"zW")}},
 HX:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
+"^":"WV;nL,Ym,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
 for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
 y.$builtinTypeInfo=[null]
-z.w6(y)}},
+z.VI(y)}},
 pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
+for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
 Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.ZB)
 else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
 w4:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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:75;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,104,105,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:106;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},
@@ -5062,12 +4762,12 @@
 "^":"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,107,23,21],
-w0:[function(a,b){var z
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,94,20,18],
+w0:function(a,b){var z
 if(a==null)throw H.b(P.u("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gXN",2,2,103,23,24,25]},
+z.CG(a,b)}},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -5124,7 +4824,7 @@
 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],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,19,20,21,22],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
@@ -5137,11 +4837,11 @@
 CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.In(this,a,b))},
-J9:function(a,b){this.OH(a)},
 X8:function(a,b,c){this.CG(a,b)},
+J9:function(a,b){this.OH(a)},
 $isvs:true,
 $isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
+static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.J9(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
@@ -5193,31 +4893,31 @@
 y=b
 b=q}}}},
 da:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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"],
+"^":"Tp:10;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,18,"call"],
 $isEH:true},
 vr:{
-"^":"Tp:108;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"],
+"^":"Tp:95;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 cX:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
 eX:{
-"^":"Tp:69;c,d",
+"^":"Tp:66;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 In:{
-"^":"Tp:69;a,b,c",
+"^":"Tp:66;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:109;b,d,e,f",
+"^":"Tp:96;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)
@@ -5227,7 +4927,7 @@
 return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:18;c,b,UI,bK",
+"^":"Tp:15;c,b,UI,bK",
 $0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
@@ -5245,7 +4945,7 @@
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
 p=H.G3()
-p=H.fH(p,[p,p]).BD(r)
+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())
@@ -5263,7 +4963,7 @@
 r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
+"^":"Tp:15;c,b,Gq,Rm,w3",
 $0:function(){var z,y,x,w,v,u
 z={}
 z.a=null
@@ -5283,24 +4983,24 @@
 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,110,"call"],
+"^":"Tp:10;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:108;a,mG",
+"^":"Tp:95;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
 cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},111],
-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.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},111],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},98],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},98],
 tg:function(a,b){var z,y
 z={}
 y=P.Dt(P.a2)
@@ -5331,7 +5031,7 @@
 z.a=null
 z.a=this.KR(new P.qg(z,y),!0,new P.yB(y),y.gaq())
 return y},
-gtH:function(a){var z,y
+geK:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"cb",0))
 z.a=null
@@ -5350,36 +5050,36 @@
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,112,"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 BE:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
 Oh:{
-"^":"Tp:113;a,UI",
+"^":"Tp:100;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 kb:{
-"^":"Tp:69;bK",
+"^":"Tp:66;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,112,"call"],
+$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,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 at:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 mj:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){},
 $isEH:true},
 ib:{
-"^":"Tp:69;UI",
+"^":"Tp:66;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ia:{
@@ -5387,55 +5087,55 @@
 $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,112,"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,99,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 WN:{
-"^":"Tp:69;e,f",
+"^":"Tp:66;e,f",
 $0:function(){return this.e.$1(this.f)},
 $isEH:true},
 XPB:{
-"^":"Tp:113;a,UI",
+"^":"Tp:100;a,UI",
 $1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
 BSd:{
-"^":"Tp:69;bK",
+"^":"Tp:66;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 uO:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 hh:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;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"],
+"^":"Tp:10;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 yB:{
-"^":"Tp:69;c",
+"^":"Tp:66;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
+$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 xp:{
-"^":"Tp:69;d",
+"^":"Tp:66;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"],
+z.a=a},"$1",null,2,0,null,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Tp:69;a,c",
+"^":"Tp:66;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"],
@@ -5443,177 +5143,89 @@
 MO:{
 "^":"a;",
 $isMO:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gWS().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()},
-gWS: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.IG(function(a){return{func:"XJ",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){var z=this.Gv
-if((z&1)!==0)this.Iv(a)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(a,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.zl(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.wM(this.gYm())
-v=new P.Bc(this)
-if(z!=null)z=z.wM(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.zl(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-Bc:{
-"^":"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.gWS().Rg(a)},
-pb:function(a,b){this.gWS().oJ(a,b)},
-Pl:function(){this.gWS().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gWS().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gWS().w6(new P.WG(a,b,null))},
-Pl:function(){this.gWS().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)},
+"^":"ez;",
+w4:function(a){var z,y,x,w
+z=this.Y8
+if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
+y=$.X3
+x=a?1:0
+w=H.VM(new P.LR(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w.SJ=w
+w.iE=w
+x=z.SJ
+w.SJ=x
+w.iE=z
+x.siE(w)
+z.SJ=w
+w.Ae=z.Gv&1
+if(z.iE===w)P.ot(z.nL)
+return w},
 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,nb",
+Bx:{
+"^":"KA;Y8<",
 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]},
+uO:[function(){this.gY8()},"$0","gp4",0,0,15],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,15]},
 NOT:{
 "^":"a;"},
 KA:{
 "^":"a;pN,o7<,Bd,Lj<,Gv,lz,nb",
-WN:function(a){if(a==null)return
-this.nb=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.nb.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
+Fv:[function(a,b){var z,y
+z=this.Gv
 if((z&8)!==0)return
 this.Gv=(z+128|4)>>>0
 if(b!=null)b.wM(this.gDQ(this))
-if(z<128&&this.nb!=null)this.nb.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,114,23,115],
+if(z<128&&this.nb!=null){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,101,20,102],
 zl:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
-if(z<128){if((z&64)!==0){z=this.nb
-z=!z.gl0(z)}else z=!1
-if(z)this.nb.t2(this)
-else{z=(this.Gv&4294967291)>>>0
+if(z<128)if((z&64)!==0&&this.nb.N6!=null)this.nb.t2(this)
+else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
+if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,15],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
 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
+tk:function(){var z,y
+z=(this.Gv|8)>>>0
 this.Gv=z
-if((z&64)!==0)this.nb.FK()
-if((this.Gv&32)===0)this.nb=null
+if((z&64)!==0){y=this.nb
+if(y.Gv===1)y.Gv=3}if((z&32)===0)this.nb=null
 this.lz=this.tA()},
 Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z<32)this.Iv(a)
-else this.w6(H.VM(new P.fZ(a,null),[null]))},
+else this.VI(H.VM(new P.fZ(a,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))},
+else this.VI(new P.WG(a,b,null))},
 YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
 if(z<32)this.Pl()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
+else this.VI(C.ZB)},
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 tA:function(){},
-w6:function(a){var z,y
+VI:function(a){var z,y
 z=this.nb
 if(z==null){z=new P.qm(null,null,0)
 this.nb=z}z.h(0,a)
@@ -5631,44 +5243,37 @@
 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.wM(y)
-else y.$0()}else{y.$0()
+y.$0()}else{y.$0()
 this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
+Pl:function(){this.tk()
 this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.wM(z)
-else z.$0()},
+new P.qQ(this).$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.nb
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
+Kl:function(a){var z,y,x
+z=this.Gv
+if((z&64)!==0&&this.nb.N6==null){z=(z&4294967231)>>>0
 this.Gv=z
-if((z&4)!==0)if(z<128){z=this.nb
-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.nb=null
-return}y=(z&4)!==0
-if(a===y)break
+if((z&4)!==0)if(z<128){y=this.nb
+y=y==null||y.N6==null}else y=!1
+else y=!1
+if(y){z=(z&4294967291)>>>0
+this.Gv=z}}for(;!0;a=x){if((z&8)!==0){this.nb=null
+return}x=(z&4)!==0
+if(a===x)break
 this.Gv=(z^32)>>>0
-if(y)this.uO()
+if(x)this.uO()
 else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.nb.t2(this)},
+z=(this.Gv&4294967263)>>>0
+this.Gv=z}if((z&64)!==0&&z<128)this.nb.t2(this)},
 $isMO:true,
 static:{"^":"Xx,bG,nS,Ir,nav,Dr,JAK,N3S,bsZ"}},
 x1:{
-"^":"Tp:18;a,b,c",
-$0:[function(){var z,y,x,w,v,u
+"^":"Tp:15;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 if((y&8)!==0&&(y&16)===0)return
@@ -5677,21 +5282,21 @@
 if(!y.fC($.X3))$.X3.hk(this.b,this.c)
 else{x=z.o7
 w=H.G3()
-w=H.fH(w,[w,w]).BD(x)
+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"],
+else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
+"^":"Tp:15;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"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
 ez:{
 "^":"cb;",
@@ -5727,10 +5332,9 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.Vd(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
+this.Gv=1}},
 Vd:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5754,41 +5358,17 @@
 V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null}},
-to:{
-"^":"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.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,114,23,115],
-zl:[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],
-$isMO:true,
-static:{"^":"FkV,ED7,kf"}},
 dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+"^":"Tp:66;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:116;a,b",
+"^":"Tp:103;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"],
+"^":"Tp:66;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
 og:{
 "^":"cb;",
@@ -5816,16 +5396,16 @@
 P.KA.prototype.oJ.call(this,a,b)},
 uO:[function(){var z=this.WS
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
+z.yy(0)},"$0","gp4",0,0,15],
 LP:[function(){var z=this.WS
 if(z==null)return
-z.zl(0)},"$0","gZ9",0,0,18],
+z.zl(0)},"$0","gZ9",0,0,15],
 tA:function(){var z=this.WS
 if(z!=null){this.WS=null
 z.ed()}return},
-vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},102],
-xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,117,24,25],
-fE:[function(){this.YB()},"$0","gH1",0,0,18],
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},92],
+xL:[function(a,b){this.oJ(a,b)},"$2","gRE",4,0,104,21,22],
+fE:[function(){this.YB()},"$0","gH1",0,0,15],
 Ri:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5868,7 +5448,7 @@
 aY:{
 "^":"a;"},
 yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,il<",
+"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,mp>,il<",
 hk:function(a,b){return this.E2.$2(a,b)},
 Gr:function(a){return this.cP.$1(a)},
 FI:function(a,b){return this.Ot.$2(a,b)},
@@ -5879,7 +5459,7 @@
 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)},
+Ch:function(a,b){return this.mp.$1(b)},
 qp:function(a){return this.il.$1$specification(a)}},
 qK:{
 "^":"a;"},
@@ -5919,15 +5499,15 @@
 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)
+for(;y=z.gtp(),y.gmp(y)==null;)z=z.geT(z)
 y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
+y.gmp(y).$4(z,new P.Id(z.geT(z)),b,c)},
 ld:function(a,b,c){var z,y
 z=this.nU
 for(;z.gtp().gil()==null;)z=z.geT(z)
 y=z.geT(z)
 return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
+ld:{
 "^":"a;",
 fC:function(a){return this.gC5()===a.gC5()},
 bH:function(a){var z,y,x,w
@@ -5956,23 +5536,23 @@
 if(b)return new P.Cg(this,z)
 else return new P.Hs(this,z)}},
 TF:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Xz:{
-"^":"Tp:69;c,d",
+"^":"Tp:66;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"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,30,"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"],
+"^":"Tp:10;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,30,"call"],
 $isEH:true},
 uo:{
-"^":"fZi;eT>,tp<,Se",
+"^":"ld;eT>,tp<,Se",
 gC5:function(){return this.eT.gC5()},
 t:function(a,b){var z,y
 z=this.Se
@@ -5992,11 +5572,11 @@
 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",
+"^":"Tp:66;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",
+"^":"Tp:66;c,d",
 $0:[function(){var z,y
 z=this.c
 P.FL("Uncaught Error: "+H.d(z))
@@ -6006,8 +5586,8 @@
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Uez:{
-"^":"Tp:75;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+"^":"Tp:69;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,70,18,"call"],
 $isEH:true},
 AH:{
 "^":"a;",
@@ -6015,7 +5595,7 @@
 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()},
+gOt:function(){return P.MM()},
 FI:function(a,b){return this.gOt().$2(a,b)},
 geo:function(){return P.iy()},
 mg:function(a,b,c){return this.geo().$3(a,b,c)},
@@ -6030,14 +5610,14 @@
 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)},
+gmp:function(a){return P.aW()},
+Ch:function(a,b){return this.gmp(this).$1(b)},
 gil:function(){return P.Is()},
 qp:function(a){return this.gil().$1$specification(a)}},
 R81:{
-"^":"fZi;",
+"^":"ld;",
 geT:function(a){return},
-gtp:function(){return C.dS},
+gtp:function(){return C.v8},
 gC5:function(){return this},
 fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
@@ -6045,7 +5625,7 @@
 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)},
+FI:function(a,b){return P.V7(this,null,this,a,b)},
 mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
 Al:function(a){return a},
 wY:function(a){return a},
@@ -6057,8 +5637,8 @@
 "^":"",
 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],
+R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,42,43,44],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,45,43],
 YM:function(a,b,c,d,e){var z
 if(a==null){z=new P.bA(0,null,null,null,null)
 z.$builtinTypeInfo=[d,e]
@@ -6066,27 +5646,21 @@
 return P.MP(a,b,c,d,e)},
 RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
 op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
+yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
 Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
+if($.Ex().tg(0,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)
+$.Ex().h(0,a)
+try{P.T4(a,z)}finally{$.Ex().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
 y.KF(c)
 return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(a))return b+"..."+c
+WE:function(a,b,c){var z
+if($.Ex().tg(0,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)
+$.Ex().h(0,a)
+try{z.We(a,", ")}finally{$.Ex().Rz(0,a)}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
@@ -6122,15 +5696,15 @@
 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
+vW:function(a){var z,y,x,w
 z={}
-if(P.nH(a))return"{...}"
+for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
 y=P.p9("")
-try{$.Ex().push(a)
+try{$.tw().push(a)
 y.KF("{")
 z.a=!0
 J.kH(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
+y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
 z.pop()}return y.gvM()},
 bA:{
@@ -6239,8 +5813,8 @@
 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,118,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,105,"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
@@ -6277,7 +5851,7 @@
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -6329,17 +5903,17 @@
 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
+return y==null?null:y.gS4()}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)},
+return y==null?null:y.gS4()}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()},
+return y[x].gS4()},
 u:function(a,b,c){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Jc()
@@ -6353,7 +5927,7 @@
 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)
+if(w>=0)x[w].sS4(b)
 else x.push(this.pE(a,b))}},
 to:function(a,b){var z
 if(this.x4(a))return this.t(0,a)
@@ -6371,7 +5945,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gcA()},
+return w.gS4()},
 V1:function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -6382,19 +5956,19 @@
 aN:function(a,b){var z,y
 z=this.H9
 y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
+for(;z!=null;){b.$2(z.gkh(),z.gS4())
 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)},
+else z.sS4(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()},
+return z.gS4()},
 pE:function(a,b){var z,y
 z=new P.aj(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -6426,8 +6000,8 @@
 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,118,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,105,"call"],
 $isEH:true},
 pk:{
 "^":"Tp;a",
@@ -6435,7 +6009,7 @@
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 aj:{
-"^":"a;kh<,cA@,DG@,zQ@"},
+"^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
 "^":"mW;Fb",
 gB:function(a){return this.Fb.X5},
@@ -6467,7 +6041,7 @@
 return!0}}}},
 jg:{
 "^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),0,null)
+gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 gB:function(a){return this.X5},
@@ -6498,15 +6072,15 @@
 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
+z=y}return this.cA(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(b)},
+x=y}return this.cA(x,b)}else return this.NZ(b)},
 NZ:function(a){var z,y,x
 z=this.OB
-if(z==null){z=P.V5()
+if(z==null){z=P.jB()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null)z[y]=[a]
@@ -6552,7 +6126,7 @@
 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
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=0;++this.X5
 this.DM=null
 return!0},
@@ -6568,11 +6142,19 @@
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{V5:function(){var z=Object.create(null)
+static:{jB:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
 return z}}},
-cN:{
+YO:{
+"^":"jg;X5,vv,OX,OB,DM",
+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){x=a[y]
+if(x==null?b==null:x===b)return y}return-1}},
+oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -6628,12 +6210,12 @@
 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
+z=y}return this.cA(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(b)},
+x=y}return this.cA(x,b)}else return this.NZ(b)},
 NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.T2()
@@ -6660,7 +6242,7 @@
 this.vv=null
 this.X5=0
 this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
+cA:function(a,b){if(a[b]!=null)return!1
 a[b]=this.xf(b)
 return!0},
 Nv:function(a,b){var z
@@ -6722,9 +6304,9 @@
 "^":"Vj;"},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"mW")},31],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},28],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},28],
 tg:function(a,b){var z
 for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
@@ -6801,8 +6383,8 @@
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},28],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},28],
 eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
@@ -6853,7 +6435,7 @@
 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},
-kJ:function(a,b){return this.XU(a,b,0)},
+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
@@ -6884,7 +6466,7 @@
 $isQV:true,
 $asQV:null},
 W0:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
@@ -7041,12 +6623,12 @@
 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.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"OA2",args:[a]}]}},this.$receiver,"lfu")},31],
+ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},28],
 bu:function(a){return P.WE(this,"{","}")},
 ev:function(a,b){var z=new H.U5(this,b)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-lM:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"nf",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.Kp(this,0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},28],
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
 zV:function(a,b){var z,y,x
@@ -7073,12 +6655,12 @@
 $asQV:null},
 Vj:{
 "^":"lfu;"},
-oz:{
+qv:{
 "^":"a;G3>,Bb>,T8>",
-$isoz:true},
+$isqv:true},
 jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
+"^":"qv;P*,G3,Bb,T8",
+$asqv:function(a,b){return[a]}},
 vX1:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
@@ -7143,8 +6725,8 @@
 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])
+y=H.VM(new P.HW(this,H.VM([],[P.qv]),this.qT,this.bb,null),[z])
+y.Qf(this,[P.qv,z])
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gG3(x),z.gP(x))}},
@@ -7163,9 +6745,9 @@
 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])}}},
+return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=H.IU(a,this.a)
 return z},
 $isEH:true},
@@ -7203,7 +6785,7 @@
 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=new P.DN(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,0))
 return y},
@@ -7214,7 +6796,7 @@
 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=new P.ZM(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,1))
 return y},
@@ -7231,7 +6813,7 @@
 HW:{
 "^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
+$asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 Uw:function(a,b){var z=b==null?new P.hW():b
 return z.$2(null,new P.f1(z).$1(a))},
@@ -7242,13 +6824,13 @@
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
 throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
-NC:[function(a){return a.Bu()},"$1","bx",2,0,49,50],
+NC:[function(a){return a.Lt()},"$1","bx",2,0,46,47],
 hW:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
@@ -7276,7 +6858,7 @@
 "^":"Ud;Ct,FN",
 bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
+D4:{
 "^":"Wf;qa<,fO",
 pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
@@ -7293,13 +6875,13 @@
 "^":"zF;qa<",
 $aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;fO,cS,ol",
+"^":"a;fO,p8,ol",
 iY:function(a){return this.fO.$1(a)},
 Ip:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=z.gB(a)
 if(typeof y!=="number")return H.s(y)
-x=this.cS
+x=this.p8
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -7357,24 +6939,24 @@
 throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.cS.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.cS.KF("true")
-return!0}else if(a===!1){this.cS.KF("false")
-return!0}else if(a==null){this.cS.KF("null")
-return!0}else if(typeof a==="string"){z=this.cS
+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.cS
+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.cS
+y=this.p8
 y.KF("{")
 for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
@@ -7386,7 +6968,7 @@
 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,Wk,BLm,vk,MU,mrt,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+static:{"^":"P3,hyY,IE,Jyf,NoV,HVe,Wk,pe,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
 b=P.bx()
 z=P.p9("")
 P.uI(z,b,c).C7(a)
@@ -7446,7 +7028,7 @@
 if(typeof c!=="number")return H.s(c)
 z=this.IT
 y=z.length
-x=J.Qe(a)
+x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
 if(v<=127){u=this.L8
@@ -7477,7 +7059,7 @@
 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],
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,48,43,44],
 hl:function(a){var z,y,x,w,v
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
 if(typeof a==="string"){z=new P.Rn("")
@@ -7497,8 +7079,8 @@
 z.vM=y
 return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,52],
-QP:[function(a){return H.CU(a)},"$1","V4",2,0,53],
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,49],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,50],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
 for(y=J.mY(a);y.G();)z.push(y.gl())
@@ -7518,18 +7100,18 @@
 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
+t=(a[t]&C.jn.KI(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},
 Y25:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Tp:119;a",
+"^":"Tp:106;a",
 $2:function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(a.gfN())
@@ -7564,7 +7146,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"bS,Vp,Eu,Kw,h2,mo,EQe,Qg,Hm,Xs,Fz,LC,E03,KeL,Cgd,NrX,Dk,o4I,T3F,ek0,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"bS,Vp8,Eu,Kw,h2,mo,EQe,Qg,tp1,Xs,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,PW,TO,fQ",zu:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -7611,12 +7193,12 @@
 return"00"+a},h0:function(a){if(a>=10)return""+a
 return"0"+a}}},
 MF:{
-"^":"Tp:120;",
+"^":"Tp:107;",
 $1:function(a){if(a==null)return 0
 return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:121;",
+"^":"Tp:108;",
 $1:function(a){if(a==null)return 0
 return H.RR(a,null)},
 $isEH:true},
@@ -7652,9 +7234,9 @@
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"YN,v7,dko,LoB,zj5,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,D9,Wr,Nw,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:15;",
+"^":"Tp:12;",
 $1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
@@ -7663,7 +7245,7 @@
 return"00000"+H.d(a)},
 $isEH:true},
 wr:{
-"^":"Tp:15;",
+"^":"Tp:12;",
 $1:function(a){if(a>=10)return H.d(a)
 return"0"+H.d(a)},
 $isEH:true},
@@ -7752,17 +7334,17 @@
 "^":"a;oc>",
 bu:function(a){return"Expando:"+H.d(this.oc)},
 t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
+return z==null?null:H.of(z,this.Qz())},
 u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.wV(b,"expando$values",z)}H.wV(z,this.J4(),c)},
-J4:function(){var z,y
+H.R0(b,"expando$values",z)}H.R0(z,this.Qz(),c)},
+Qz:function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Ss"}},
+H.R0(this,"expando$key",z)}return z},
+static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
@@ -7813,10 +7395,10 @@
 $isqU:true},
 "+String":0,
 WU:{
-"^":"a;Cb,R7,C3,Wn",
+"^":"a;Cb,R7,Oq,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.C3
+z=this.Oq
 this.R7=z
 y=this.Cb
 x=y.length
@@ -7824,9 +7406,9 @@
 return!1}w=C.xB.j(y,z)
 v=this.R7+1
 if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
+if((u&64512)===56320){this.Oq=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
+return!0}}this.Oq=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7851,35 +7433,32 @@
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
 return z}}},
-GD:{
+IN:{
 "^":"a;",
-$isGD:true},
+$isIN:true},
 uq:{
 "^":"a;",
 $isuq:true},
 rI:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 r3:function(a,b){return document.createElement(a)},
-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.fd(0,z.bi,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.fd(0,z.bi,z.Ph,W.aF(y.gXN()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
+pS:function(a,b){var z,y
+z=typeof a!=="string"
+if((!z||a==null)&&!0)return new WebSocket(a)
+y=H.RB(b,"$isWO",[P.qU],"$asWO")
+if(!y);y=!z||a==null
+if(y)return new WebSocket(a,b)
+z=!z||a==null
+if(z)return new WebSocket(a,b)
+throw H.b(P.u("Incorrect number or type of arguments"))},
 VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
 return a^a>>>6},
@@ -7893,23 +7472,22 @@
 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.UC(a)},"$1","Z6",2,0,13,54],
-Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,55,54,56,57,58],
+Xw:function(a,b){return new W.uY(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,51],
+Hx:[function(a){return J.UC(a)},"$1","Z6",2,0,10,51],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,52,51,53,54,55],
 aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
 return $.X3.Nf(a,!0)},
 Bo:{
 "^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Vct|i6|Xfs|JI|D13|ZP|WZq|nJ|SaM|Eg|i7|pva|Gk|cda|Nr|waa|MJ|T53|DK|V3|BS|V9|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|qh|V15|oF|V16|Q6|uE|V17|Zn|V18|n5|V19|Ma|wN|V20|ds|V21|ou|ZzR|av|V22|uz|V23|kK|oa|V24|St|V25|IW|V26|Qh|V27|Oz|V28|YA|V29|qk|V30|vj|LU|V31|CX|V32|md|V33|Bm|V34|Ya|V35|Ww|ye|V36|G1|V37|fl|V38|UK|V39|wM|V40|F1|V41|ov|oEY|kn|V42|fI|V43|zM|V44|Rk|V45|Ti|KAf|CY|V46|nm|V47|uw|I5|V48|el"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LPc|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V3|Vb|V5|Ly|pR|V9|hx|V10|L4|Mb|V11|mO|DE|V12|U1|qh|V13|oF|V14|Q6|uE|V15|Zn|V16|n5|V17|Ma|wN|V18|ds|V19|ou|ZzR|av|V20|uz|V21|kK|oa|V22|St|V23|IW|V24|Qh|V25|Oz|V26|YA|V27|qk|V28|vj|LU|V29|CX|V30|md|V31|Bm|V32|Ya|V33|Ww|V34|G1|V35|fl|V36|UK|V37|wM|V38|F1|V39|qZ|V40|ov|oEY|kn|V41|fI|V42|zM|V43|Rk|V44|Ti|KAf|CY|V45|nm|V46|uw|I5|V47|el"},
 Yyn:{
 "^":"Gv;",
 $isWO:true,
-$asWO:function(){return[W.M5]},
+$asWO:function(){return[W.QI]},
 $isyN:true,
 $isQV:true,
-$asQV:function(){return[W.M5]},
+$asQV:function(){return[W.QI]},
 "%":"EntryArray"},
 Ps:{
 "^":"Bo;N:target=,t5:type%,mH:href=,yv:protocol=",
@@ -7933,7 +7511,7 @@
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLBodyElement"},
-Ox:{
+IFv:{
 "^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
 "%":"HTMLButtonElement"},
 Ny:{
@@ -7954,8 +7532,9 @@
 Zl:{
 "^":"KV;Rn:data=,B:length=",
 "%":"Comment;CharacterData"},
-BI:{
+K3:{
 "^":"ea;tT:code=",
+$isK3:true,
 "%":"CloseEvent"},
 y4:{
 "^":"w6O;Rn:data=",
@@ -8012,7 +7591,7 @@
 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)},
+gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
 Es:function(a){this.q0(a)},
 dQ:function(a){this.Nz(a)},
 q0:function(a){},
@@ -8027,7 +7606,7 @@
 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"))},
-Ft:function(a,b){var z=a
+jn:function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
@@ -8057,7 +7636,7 @@
 gN:function(a){return W.qc(a.target)},
 e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
 PZ:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
@@ -8078,11 +7657,6 @@
 YuD:{
 "^":"Bo;B:length=,Sf:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-Me:{
-"^":"Gv;B:length=",
-f7:[function(a){return a.back()},"$0","gSk",0,0,18],
-og:[function(a){return a.forward()},"$0","gWc",0,0,18],
-"%":"History"},
 xnd:{
 "^":"ecX;",
 gB:function(a){return a.length},
@@ -8104,12 +7678,11 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
+"^":"rk;pf:status=",
 gbA:function(a){return W.Z9(a.response)},
-Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+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;",
@@ -8133,16 +7706,13 @@
 $isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
 ttH:{
 "^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 pL:{
 "^":"Bo;P:value%",
 "%":"HTMLLIElement"},
-xT:{
+eP:{
 "^":"Bo;MB:form=",
 "%":"HTMLLabelElement"},
 mF:{
@@ -8162,13 +7732,13 @@
 eL:{
 "^":"Bo;kc:error=",
 xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
+yy:[function(a){return a.pause()},"$0","gX0",0,0,15],
 "%":"HTMLAudioElement;HTMLMediaElement",
 static:{"^":"TH<"}},
 mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
-Wyx:{
+Br:{
 "^":"Gv;tT:code=",
 "%":"MediaKeyError"},
 aBv:{
@@ -8194,8 +7764,8 @@
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
+Oq:{
+"^":"w6O;",
 nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.ju(p))
 return},
 gD7:function(a){var z,y
@@ -8204,14 +7774,14 @@
 z=W.qc(a.target)
 y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.mB(z)))
 return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
+$isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 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)},
+gUN:function(a){return new W.wi(a)},
 zB:function(a){var z=a.parentNode
 if(z!=null)z.removeChild(a)},
 Tk:function(a,b){var z,y
@@ -8271,14 +7841,10 @@
 me:{
 "^":"Bo;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-dg:{
-"^":"ea;",
-$isdg:true,
-"%":"PopStateEvent"},
 j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-nC:{
+qW:{
 "^":"Zl;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
@@ -8286,12 +7852,11 @@
 "%":"HTMLProgressElement"},
 kQ:{
 "^":"ea;ox:loaded=",
-$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 bXi:{
 "^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
-j24:{
+Tw:{
 "^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
 bs:{
@@ -8306,13 +7871,13 @@
 yNV:{
 "^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-uaa:{
+GA:{
 "^":"ea;Cf:results=",
 "%":"SpeechInputEvent"},
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-S2:{
+Hd:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
 vt:{
@@ -8321,7 +7886,7 @@
 my:{
 "^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 kI:{
@@ -8350,34 +7915,38 @@
 "^":"Bo;jb:content=",
 $isOH:true,
 "%":"HTMLTemplateElement"},
-HF:{
+Un:{
 "^":"Zl;",
-$isHF:true,
+$isUn:true,
 "%":"CDATASection|Text"},
 AE:{
 "^":"Bo;MB:form=,oc:name%,WT:rows=,t5:type=,P:value%",
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-R0:{
+xVu:{
 "^":"w6O;Rn:data=",
 "%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,AE:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
+li:{
 "^":"Bo;fY:kind%,ph:label%",
 "%":"HTMLTrackElement"},
 w6O:{
 "^":"ea;",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
+"%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
 SW:{
 "^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
+lf:{
+"^":"PZ;yv:protocol=,O3:url=",
+LG:function(a,b,c){return a.close(b,c)},
+S6:function(a){return a.close()},
+wR:function(a,b){return a.send(b)},
+$islf:true,
+"%":"WebSocket"},
 K5:{
 "^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
 S6:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.pf(b),c)
+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()},
@@ -8423,7 +7992,7 @@
 "^":"Bo;",
 $isPZ:true,
 "%":"HTMLFrameSetElement"},
-rh:{
+rhM:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -8547,10 +8116,10 @@
 z.S8(a,b)
 return z}}},
 HU:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-M5:{
+QI:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
@@ -8559,7 +8128,7 @@
 "^":"Jn;WK:YO<,WK",
 t:function(a,b){var z,y
 z=$.PO()
-y=J.Qe(b)
+y=J.rY(b)
 if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cq(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.Cq(this.YO,b,!1),[null])},
 static:{"^":"Ha"}},
@@ -8577,22 +8146,6 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:75;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.rC(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
 wi:{
 "^":"rm;NL",
 grZ:function(a){var z=this.NL.lastChild
@@ -8717,7 +8270,7 @@
 $isZ0:true,
 $asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
 E9:{
@@ -8732,7 +8285,7 @@
 return y},
 gB:function(a){return this.gvc().length},
 FJ:function(a){return a.namespaceURI==null}},
-iW:{
+ye:{
 "^":"As3;QX,Kd",
 lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
@@ -8741,20 +8294,20 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.iW(a,null)
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Zu()),[null,null])},
+static:{or:function(a){var z=new W.ye(a,null)
 z.yJ(a)
 return z}}},
-Xw:{
-"^":"Tp:13;",
+Zu:{
+"^":"Tp:10;",
 $1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
@@ -8767,8 +8320,8 @@
 J.Pw(this.MW,a.zV(0," "))}},
 FkO:{
 "^":"a;Ph",
-zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.zc(a,!1)}},
+DT:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
+LX:function(a){return this.DT(a,!1)}},
 RO:{
 "^":"cb;bi,Ph,Sg",
 KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
@@ -8783,11 +8336,11 @@
 return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"cb",0),null])},
 $iscb:true},
 ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.Sq(J.l2(a),this.a)},
+"^":"Tp:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 tS:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8807,11 +8360,11 @@
 yI:function(a){return this.KR(a,null,null,null)},
 $iscb:true},
 i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.Sq(J.l2(a),this.a)},
+"^":"Tp:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){J.SS(a,this.b)
 return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
@@ -8824,10 +8377,10 @@
 return},
 Fv:[function(a,b){if(this.bi==null)return;++this.VP
 this.Jc()
-if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,114,23,115],
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,101,20,102],
 gUF:function(){return this.VP>0},
 zl:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
+this.Zz()},"$0","gDQ",0,0,15],
 Zz:function(){var z=this.G9
 if(z!=null&&this.VP<=0)J.FI(this.bi,this.Ph,z,this.Sg)},
 Jc:function(){var z=this.G9
@@ -8844,10 +8397,10 @@
 S6:[function(a){var z,y
 for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.S6(0)},"$0","gJK",0,0,18],
+this.aV.S6(0)},"$0","gJK",0,0,15],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 rC:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Gm:{
@@ -8884,7 +8437,7 @@
 XP:function(a,b){J.br(this.xa,b)},
 Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return J.q6(this.xa,b,c)},
-kJ:function(a,b){return this.XU(a,b,0)},
+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)},
@@ -8907,17 +8460,17 @@
 return!1},
 gl:function(){return this.QZ}},
 uY:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
+return this.a(a)},"$1",null,2,0,null,51,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 S6:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.pf(b),c)},
+kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
 D9:function(a,b,c){return this.kr(a,b,c,null)},
 gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
 YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
@@ -8932,7 +8485,7 @@
 "%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
 "^":"",
 Y0:{
-"^":"tpr;N:target=,mH:href=",
+"^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
 ZJQ:{
 "^":"Pt;mH:href=",
@@ -8943,7 +8496,7 @@
 bd:{
 "^":"MB;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-vA:{
+R8:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 nQ:{
@@ -8964,25 +8517,25 @@
 mz:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-Ob:{
+vz:{
 "^":"MB;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-oBW:{
+Tf:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-wC:{
+yum:{
 "^":"MB;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-Lj:{
+MI:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-Ub:{
+rg:{
 "^":"MB;x=,y=",
 "%":"SVGFEPointLightElement"},
 bMB:{
 "^":"MB;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-pQ:{
+HAk:{
 "^":"MB;x=,y=",
 "%":"SVGFESpotLightElement"},
 Qya:{
@@ -8995,16 +8548,16 @@
 "^":"MB;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 mg:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 "%":"SVGForeignObjectElement"},
 TQ:{
-"^":"tpr;",
+"^":"zp;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
+zp:{
 "^":"MB;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 SL:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGImageElement"},
 NBZ:{
 "^":"MB;x=,y=",
@@ -9015,7 +8568,7 @@
 NJ:{
 "^":"TQ;x=,y=",
 "%":"SVGRectElement"},
-qIR:{
+nd:{
 "^":"MB;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
 EUL:{
@@ -9035,12 +8588,12 @@
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
 static:{"^":"OY<"}},
 hy:{
-"^":"tpr;x=,y=",
+"^":"zp;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
-"^":"tpr;",
+"^":"zp;",
 "%":";SVGTextContentElement"},
 xN:{
 "^":"mHq;Sf:method=,mH:href=",
@@ -9049,7 +8602,7 @@
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 ci:{
-"^":"tpr;x=,y=,mH:href=",
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGUseElement"},
 cuU:{
 "^":"MB;mH:href=",
@@ -9068,26 +8621,16 @@
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
-hM:function(){var z,y,x
-z=$.Fd
-$.Fd=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.A1(y,null)
-x.TL(y)
-return x},
-hq:{
+wC:{
 "^":"a;",
-$ishq:true,
+$iswC:true,
 static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
 xZ:function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,38,56,24,57],
 Dm:function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
 return!0}catch(z){H.Ru(z)}return!1},
@@ -9101,7 +8644,7 @@
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,13,61],
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,10,58],
 hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
 P.Dm(a,b,z)}return z},
@@ -9112,7 +8655,7 @@
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,49,61],
+else return P.ND(a)}},"$1","Xl",2,0,46,58],
 ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
 else if(a instanceof Array)return P.iQ(a,$.LZ(),new P.Jd())
 else return P.iQ(a,$.LZ(),new P.QS())},
@@ -9149,7 +8692,7 @@
 return P.ND(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
 return P.ND(P.wY(a))},jT:function(a){return P.ND(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
 Xb:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
@@ -9160,7 +8703,7 @@
 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"],
+return v}else return P.wY(a)},"$1",null,2,0,null,58,"call"],
 $isEH:true},
 r7:{
 "^":"E4;eh",
@@ -9172,7 +8715,7 @@
 $isr7:true,
 static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
 Tz:{
-"^":"F6;eh",
+"^":"WkF;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
@@ -9206,7 +8749,7 @@
 Jd:function(a){return this.XP(a,null)},
 static:{oY:function(a,b,c){if(a<0||a>c)throw H.b(P.TE(a,0,c))
 if(b<a||b>c)throw H.b(P.TE(b,a,c))}}},
-F6:{
+WkF:{
 "^":"E4+lD;",
 $isWO:true,
 $asWO:null,
@@ -9214,25 +8757,25 @@
 $isQV:true,
 $asQV:null},
 DV:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
 return z},
 $isEH:true},
 Hp:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
@@ -9376,18 +8919,48 @@
 $isEX:true},
 IV:{
 "^":"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
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
+if(typeof z!=="number")return z.g()
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
+if(typeof z!=="number")return z.g()
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 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
+y=this.gBb(this)
+x=z.gBb(b)
+if(y==null?x==null:y===x){y=this.G6
+x=z.gG6(b)
+if(y==null?x==null:y===x){x=this.Bb
+w=this.R
+if(typeof x!=="number")return x.g()
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}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))},
+giO:function(a){var z,y,x,w,v,u
+z=J.v1(this.gBb(this))
+y=this.G6
+x=J.v1(y)
+w=this.Bb
+v=this.R
+if(typeof w!=="number")return w.g()
+if(typeof v!=="number")return H.s(v)
+u=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof u!=="number")return H.s(u)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
 gSR:function(a){var z=new P.EX(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
@@ -9396,13 +8969,17 @@
 $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
+if(typeof c!=="number")return c.C()
+if(c<0)z=-c*0
+else z=c
+if(typeof d!=="number")return d.C()
+if(d<0)y=-d*0
+else y=d
 return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
 ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
-"^":"mA;Rp"},
+"^":"mA;EV"},
 mA:{
 "^":"Nx+cw;",
 $isZ0:true},
@@ -9414,19 +8991,19 @@
 $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
+t:function(a,b){return this.EV.t(0,b)},
+u:function(a,b,c){this.EV.u(0,b,c)},
+FV:function(a,b){this.EV.FV(0,b)},
+V1:function(a){this.EV.V1(0)},
+aN:function(a,b){this.EV.aN(0,b)},
+gl0:function(a){return this.EV.X5===0},
+gor:function(a){return this.EV.X5!==0},
+gvc:function(){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
+gB:function(a){return this.EV.X5},
+gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
+bu:function(a){return P.vW(this.EV)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
 ic:function(a){a.toString
@@ -9448,7 +9025,7 @@
 ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
 $ispF:true,
 $isAS:true,
-"%":";ArrayBufferView;we|Ui|GVy|Dg|ObS|Ipv|Pg"},
+"%":";ArrayBufferView;we|Ob|GVy|Dg|Ui|Ipv|Pg"},
 di:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -9470,7 +9047,7 @@
 $asQV:function(){return[P.CP]},
 $isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
 gbx:function(a){return C.G0},
 t:function(a,b){var z=a.length
@@ -9504,7 +9081,7 @@
 "%":"Int16Array"},
 dE5:{
 "^":"Pg;",
-gbx:function(a){return C.XI},
+gbx:function(a){return C.KS},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9552,7 +9129,7 @@
 "%":"Uint16Array"},
 rs:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
+gbx:function(a){return C.dH},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 return a[b]},
@@ -9626,7 +9203,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.CP]}},
-Ui:{
+Ob:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.CP]},
@@ -9634,7 +9211,7 @@
 $isQV:true,
 $asQV:function(){return[P.CP]}},
 GVy:{
-"^":"Ui+h5;"},
+"^":"Ob+Lj;"},
 Pg:{
 "^":"Ipv;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
@@ -9646,7 +9223,7 @@
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[P.KN]}},
-ObS:{
+Ui:{
 "^":"we+lD;",
 $isWO:true,
 $asWO:function(){return[P.KN]},
@@ -9654,7 +9231,7 @@
 $isQV:true,
 $asQV:function(){return[P.KN]}},
 Ipv:{
-"^":"ObS+h5;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+"^":"Ui+Lj;"}}],["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)
@@ -9663,10 +9240,10 @@
 return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 ZP:{
-"^":"D13;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"Vct;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkc:function(a){return a.Py},
 skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y,x,w
+static:{Yw:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9678,12 +9255,12 @@
 C.OD.ZL(a)
 C.OD.XI(a)
 return a}}},
-D13:{
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 nJ:{
-"^":"WZq;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 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},
@@ -9698,7 +9275,7 @@
 z=this.ct(a,C.eh,a.Ek,z)
 a.Ek=z
 if(J.xC(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,100,1,94,95],
+a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,88,1,89,90],
 Z1:[function(a,b,c,d){var z,y,x
 J.fD(b)
 z=a.a3
@@ -9707,9 +9284,9 @@
 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,100,1,94,95],
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,88,1,89,90],
 YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,122,1],
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,109,1],
 static:{Rp:function(a){var z,y,x,w,v
 z=R.tB([])
 y=$.XZ()
@@ -9722,15 +9299,15 @@
 a.on=y
 a.BA=x
 a.LL=v
-C.zg.ZL(a)
-C.zg.XI(a)
+C.Gh.ZL(a)
+C.Gh.XI(a)
 return a}}},
-WZq:{
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
 Eg:{
@@ -9751,7 +9328,7 @@
 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)).wM(new R.Ou(a))}},"$3","gbN",6,0,79,46,47,80],
+this.LY(a,a.jv).ml(new R.uv(a)).wM(new R.Ou(a))}},"$3","gbN",6,0,73,43,44,74],
 static:{fL:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -9770,15 +9347,15 @@
 C.UF.XI(a)
 return a}}},
 SaM:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 uv:{
-"^":"Tp:124;a",
+"^":"Tp:111;a",
 $1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,81,"call"],
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
 Ou:{
-"^":"Tp:69;b",
+"^":"Tp:66;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,{
@@ -9800,10 +9377,10 @@
 return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":"pva;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gt0:function(a){return a.KV},
 st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,17,84],
 static:{Sy:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -9813,19 +9390,19 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.D4.ZL(a)
-C.D4.XI(a)
+C.by.ZL(a)
+C.by.XI(a)
 return a}}},
-pva:{
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
 "^":"",
 Nr:{
-"^":"cda;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"pva;DC,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpM:function(a){return a.DC},
 spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,20,91],
-static:{TsF:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.DC).wM(b)},"$1","gvC",2,0,17,84],
+static:{na:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9834,14 +9411,14 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.n0.ZL(a)
-C.n0.XI(a)
+C.uG.ZL(a)
+C.uG.XI(a)
 return a}}},
-cda:{
+pva:{
 "^":"uL+Pi;",
 $isd3:true},
 MJ:{
-"^":"waa;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"cda;Zc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gJ6:function(a){return a.Zc},
 sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
 static:{Bs:function(a){var z,y,x,w
@@ -9856,14 +9433,14 @@
 C.Cl.ZL(a)
 C.Cl.XI(a)
 return a}}},
-waa:{
+cda:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
 DK:{
-"^":"T53;PQ,Dw,Yq,Yr,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gU4:function(a){return a.PQ},
-sU4:function(a,b){a.PQ=this.ct(a,C.QK,a.PQ,b)},
+"^":"T53;ay,MC,oX,Oc,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gU4:function(a){return a.ay},
+sU4:function(a,b){a.ay=this.ct(a,C.QK,a.ay,b)},
 Qj:[function(a,b){var z,y,x
 Q.xI.prototype.Qj.call(this,a,b)
 this.ct(a,C.ak,0,1)
@@ -9872,28 +9449,28 @@
 y=z!=null
 if(y){x=J.U6(z)
 x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
-a.Yr=this.ct(a,C.a0,a.Yr,x)
+a.Oc=this.ct(a,C.a0,a.Oc,x)
 x=y&&J.UQ(z,"parent")!=null
-a.Dw=this.ct(a,C.ak,a.Dw,x)
+a.MC=this.ct(a,C.ak,a.MC,x)
 if(y){y=J.U6(z)
 y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.Yq=this.ct(a,C.Ql,a.Yq,y)},"$1","gLe",2,0,20,57],
-gSY:function(a){return a.Dw},
-sSY:function(a,b){a.Dw=this.ct(a,C.ak,a.Dw,b)},
-gE7:function(a){return a.Yq},
-sE7:function(a,b){a.Yq=this.ct(a,C.Ql,a.Yq,b)},
-gni:function(a){return a.Yr},
-sni:function(a,b){a.Yr=this.ct(a,C.a0,a.Yr,b)},
+a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,17,54],
+gSY:function(a){return a.MC},
+sSY:function(a,b){a.MC=this.ct(a,C.ak,a.MC,b)},
+gE7:function(a){return a.oX},
+sE7:function(a,b){a.oX=this.ct(a,C.Ql,a.oX,b)},
+gni:function(a){return a.Oc},
+sni:function(a,b){a.Oc=this.ct(a,C.a0,a.Oc,b)},
 static:{E5:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
 w=W.h4
 w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.PQ=!0
-a.Dw=!1
-a.Yq=!1
-a.Yr=!1
+a.ay=!0
+a.MC=!1
+a.oX=!1
+a.Oc=!1
 a.Pe=!1
 a.on=z
 a.BA=y
@@ -9906,7 +9483,7 @@
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 BS:{
-"^":"V3;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gig:function(a){return a.P6},
 sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
 gUx:function(a){return a.Sq},
@@ -9954,9 +9531,9 @@
 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.LE(a.P6).wM(b)},"$1","gvC",2,0,20,91],
-static:{nz:function(a){var z,y,x,w
+break}},"$1","gnp",2,0,17,54],
+RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gvC",2,0,17,84],
+static:{N0:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -9968,15 +9545,15 @@
 C.cI.ZL(a)
 C.cI.XI(a)
 return a}}},
-V3:{
+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,125],
+PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,112],
 gvH:function(a){return C.CD.cU(this.mS,4)},
-static:{"^":"Q0z",Iu:function(a,b){var z,y,x
+static:{"^":"Q0z",x6:function(a,b){var z,y,x
 z=b.gy(b)
 y=J.DO(a)
 if(typeof z!=="number")return z.U()
@@ -9987,7 +9564,7 @@
 uc:{
 "^":"a;Yu<,tL"},
 Vb:{
-"^":"V9;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V3;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gpf:function(a){return a.PA},
 spf:function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},
 gyw:function(a){return a.oj},
@@ -10011,15 +9588,16 @@
 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.tn(a,c,"Free",$.Rl())
+u=J.U6(v)
+if(!J.xC(u.t(v,"type"),"@Class")){N.QM("").To(H.d(v))
+continue}t=H.BU(C.Nm.grZ(J.uH(u.t(v,"id"),"/")),null,null)
+s=t==null?C.pr:P.r2(t)
+r=[s.j1(128),s.j1(128),s.j1(128),255]
+u=J.uH(u.t(v,"name"),"@")
+if(0>=u.length)return H.e(u,0)
+y.u(0,t,u[0])
+x.u(0,t,r)
+w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.Rl())
 this.tn(a,0,"",$.Sd())},
 WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.dW
@@ -10027,7 +9605,7 @@
 if(typeof z!=="number")return z.U()
 if(typeof y!=="number")return H.s(y)
 x=z*y
-w=C.CD.cU(O.Iu(a.An,b).mS,4)
+w=C.CD.cU(O.x6(a.An,b).mS,4)
 v=C.CD.Z(w,x)
 u=C.CD.Y(w,x)
 t=J.UQ(a.oj,"pages")
@@ -10058,21 +9636,20 @@
 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.Iu(a.An,z)
+z=O.x6(a.An,z)
 w=z.mS
 v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.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,122,2],
-X7:[function(a,b){var z=J.cR(this.WE(a,J.WS(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,122,2],
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,109,78],
+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,109,78],
 My:function(a){var z,y,x,w
 z=a.oj
 if(z==null||a.hi==null)return
 this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
 y=J.UQ(a.oj,"pages")
 z=a.hi.parentElement
-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
+x=P.T7(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
 z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
 if(typeof z!=="number")return H.s(z)
 z=4+z
@@ -10095,7 +9672,7 @@
 x=a.dW
 if(typeof x!=="number")return H.s(x)
 w=b*x
-v=O.Iu(a.An,H.VM(new P.EX(0,w),[null]))
+v=O.x6(a.An,H.VM(new P.EX(0,w),[null]))
 u=J.UQ(y.t(z,b),"objects")
 y=J.U6(u)
 x=a.rM
@@ -10133,8 +9710,8 @@
 P.Iw(new O.R5(a,b),null)},
 RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,20,91],
-nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,17,84],
+nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,54],
 static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
@@ -10153,31 +9730,31 @@
 C.Cs.ZL(a)
 C.Cs.XI(a)
 return a}}},
-V9:{
+V3:{
 "^":"uL+Pi;",
 $isd3:true},
 R5:{
-"^":"Tp:69;a,b",
+"^":"Tp:66;a,b",
 $0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
 aG:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,126,"call"],
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 aO:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 oc:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){J.vP(this.a)},
 $isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 Ly:{
-"^":"V10;GQ,I8,Oc,GM,nc,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gLF:function(a){return a.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,b)},
+"^":"V5;GQ,I8,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gLF:function(a){return a.Rp},
+sLF:function(a,b){a.Rp=this.ct(a,C.kG,a.Rp,b)},
 gB1:function(a){return a.Ol},
 sB1:function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},
 q0:function(a){var z,y,x
@@ -10198,7 +9775,7 @@
 MQ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
 if(z==null||!J.x(J.UQ(z,"members")).$isWO||J.xC(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.B7()
+a.Rp.B7()
 for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
@@ -10210,7 +9787,7 @@
 r=this.zh(a,y,6)
 q=this.zh(a,y,7)
 p=this.zh(a,y,8)
-J.Jr(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.tO(a.nc)
+J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
 z=a.GQ.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
@@ -10233,23 +9810,23 @@
 v=[]
 C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
 w.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc.Yb
+v=a.JS.Yb
 v.V7("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-v=a.Oc
+v=a.JS
 w=J.U6(o)
 x=w.t(o,"used")
 v=v.Yb
 z=[]
 C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
 v.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc
+z=a.JS
 v=J.Hn(w.t(o,"capacity"),w.t(o,"used"))
 z=z.Yb
 x=[]
 C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
 z.V7("addRow",[H.VM(new P.Tz(x),[null])])
-x=a.Oc
+x=a.JS
 w=w.t(o,"external")
 x=x.Yb
 z=[]
@@ -10259,12 +9836,12 @@
 z5:function(a){var z=a.I8
 if(z==null)return
 z.W2(a.GQ)
-a.GM.W2(a.Oc)},
-JL:[function(a,b,c,d){var z,y
-if(!!J.x(d).$isv6){z=a.nc.gxp()
+a.GM.W2(a.JS)},
+BB:[function(a,b,c,d){var z,y
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.tO(a.nc)}}},"$3","gQq",6,0,93,1,94,95],
+if(z==null?y!=null:z!==y){a.Rp.sxp(y)
+J.II(a.Rp)}}},"$3","gQq",6,0,116,1,89,90],
 K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
@@ -10288,50 +9865,50 @@
 return J.ew(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
 RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,20,91],
-QH:[function(a,b){var z=a.Ol
+J.aT(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).wM(b)},"$1","gvC",2,0,17,84],
+zT:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,20,91],
+J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,84],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,20,91],
+J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,84],
 n1:[function(a,b){var z,y,x,w
 try{this.MQ(a)}catch(x){w=H.Ru(x)
 z=w
 y=new H.XO(x,null)
 N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,20,57],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,54],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,129,130],
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,117,118],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,129,130],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,117,118],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,129,130],
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,117,118],
 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)
+a.JS=new G.Kf(z)
 z.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
+a.JS.Yb.V7("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new G.Vz([new G.zb("Class",G.Q8()),new G.zb("Accumulator Size (New)",G.Fx()),new G.zb("Accumulator (New)",G.kh()),new G.zb("Current Size (New)",G.Fx()),new G.zb("Current (New)",G.kh()),new G.zb("Accumulator Size (Old)",G.Fx()),new G.zb("Accumulator (Old)",G.kh()),new G.zb("Current Size (Old)",G.Fx()),new G.zb("Current (Old)",G.kh())],z,[],0,!0,null,null))
-a.nc=z
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.Ktd("Class",G.HP()),new G.Ktd("Accumulator Size (New)",G.Fx()),new G.Ktd("Accumulator (New)",G.kh()),new G.Ktd("Current Size (New)",G.Fx()),new G.Ktd("Current (New)",G.kh()),new G.Ktd("Accumulator Size (Old)",G.Fx()),new G.Ktd("Accumulator (Old)",G.kh()),new G.Ktd("Current Size (Old)",G.Fx()),new G.Ktd("Current (Old)",G.kh())],z,[],0,!0,null,null))
+a.Rp=z
 z.sxp(1)},
-static:{"^":"IJv,bQj,tpX,wh,r1K,d6,rW,DY2",Ut:function(a){var z,y,x,w
+static:{"^":"IJv,bQj,kf,wh,r1K,qEV,pC,DY2",Ut:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10344,38 +9921,38 @@
 C.Vc.XI(a)
 C.Vc.Zy(a)
 return a}}},
-V10:{
+V5:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 jm:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 AN:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 Ao:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true},
 ke:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,126,"call"],
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 xj:{
-"^":"Tp:75;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,128,"call"],
+"^":"Tp:69;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,115,"call"],
 $isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
-pf:function(a){var z,y
+bL:function(a){var z,y
 z=[]
 y=new P.Kk(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
 new P.uS().$0()
@@ -10395,7 +9972,7 @@
 $.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
 $.R6=z}return z},
 wF:{
-"^":"Tp:48;b,c",
+"^":"Tp:45;b,c",
 $1:function(a){var z,y,x
 z=this.b
 y=z.length
@@ -10405,23 +9982,23 @@
 return y},
 $isEH:true},
 rG:{
-"^":"Tp:131;d",
+"^":"Tp:119;d",
 $1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 fh:{
-"^":"Tp:132;e",
+"^":"Tp:120;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;",
+"^":"Tp:66;",
 $0:function(){},
 $isEH:true},
 Kk:{
-"^":"Tp:13;f,UI,bK",
+"^":"Tp:10;f,UI,bK",
 $1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
@@ -10455,11 +10032,11 @@
 w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
 q1:{
-"^":"Tp:75;a,Gq",
+"^":"Tp:69;a,Gq",
 $2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:48;a,b",
+"^":"Tp:45;a,b",
 $1:function(a){var z,y,x,w
 z=this.a
 y=z.length
@@ -10469,19 +10046,19 @@
 return y},
 $isEH:true},
 D6:{
-"^":"Tp:131;c",
+"^":"Tp:119;c",
 $1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
 return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:132;d",
+"^":"Tp:120;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",
+"^":"Tp:10;e,f,UI,bK",
 $1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10522,11 +10099,11 @@
 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,133,31],
+return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,121,28],
 ev: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.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,134,31],
+Ft:[function(a,b){var z=this.lF()
+return H.VM(new H.zs(z,b),[H.Kp(z,0),null])},"$1","git",2,0,122,28],
 Vr:function(a,b){return this.lF().Vr(0,b)},
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
@@ -10555,19 +10132,19 @@
 $isQV:true,
 $asQV:function(){return[P.qU]}},
 Fe:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"rm;NJ,iz",
+"^":"rm;Yn,iz",
 gye:function(){var z=this.iz
 return P.F(z.ev(z,new P.hT()),!0,W.h4)},
 aN:function(a,b){H.bQ(this.gye(),b)},
@@ -10601,11 +10178,11 @@
 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;",
+"^":"Tp:10;",
 $1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
@@ -10618,14 +10195,14 @@
 else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
 return Q.xI.prototype.gJp.call(this,a)},
-Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,66],
 vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,135,136,91],
+c.$0()}},"$2","gNe",4,0,123,124,84],
 static:{lu:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10640,26 +10217,26 @@
 C.EL.XI(a)
 return a}}},
 qB:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=J.U6(a)
 if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
 a.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
 z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,123,"call"],
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":"V11;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V9;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 ghf:function(a){return a.Xh},
 shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
 gIi:function(a){return a.f2},
 sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,137,99],
-ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,137,33],
-RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,20,91],
+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,85,86],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,125,87],
+ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,125,30],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,17,84],
 static:{BN:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10672,20 +10249,20 @@
 C.ry.ZL(a)
 C.ry.XI(a)
 return a}}},
-V11:{
+V9:{
 "^":"uL+Pi;",
 $isd3:true},
 cL:{
-"^":"Tp:124;a",
+"^":"Tp:111;a",
 $1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,81,"call"],
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,79,"call"],
 $isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
 "^":"",
 L4:{
-"^":"V12;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V10;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gkm:function(a){return a.PM},
 skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,17,84],
 static:{p4:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10698,12 +10275,12 @@
 C.za.ZL(a)
 C.za.XI(a)
 return a}}},
-V12:{
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 Mb:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{RVI:function(a){var z,y,x,w
+static:{pD:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10717,10 +10294,10 @@
 C.Ag.XI(a)
 return a}}},
 mO:{
-"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V11;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{Ch:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10733,7 +10310,7 @@
 C.Ie.ZL(a)
 C.Ie.XI(a)
 return a}}},
-V13:{
+V11:{
 "^":"uL+Pi;",
 $isd3:true},
 DE:{
@@ -10752,13 +10329,13 @@
 C.Ig.XI(a)
 return a}}},
 U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V12;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gql:function(a){return a.yR},
 sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,20,91],
-TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,18],
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,17,84],
+TY:[function(a){J.LE(a.yR).wM(new E.eG(a))},"$0","gW6",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.gW6(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -10776,13 +10353,13 @@
 C.NK.ZL(a)
 C.NK.XI(a)
 return a}}},
-V14:{
+V12:{
 "^":"uL+Pi;",
 $isd3:true},
 eG:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 qh:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
@@ -10800,10 +10377,10 @@
 C.wK.XI(a)
 return a}}},
 oF:{
-"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V13;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{J3z:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10816,14 +10393,14 @@
 C.Tl.ZL(a)
 C.Tl.XI(a)
 return a}}},
-V15:{
+V13:{
 "^":"uL+Pi;",
 $isd3:true},
 Q6:{
-"^":"V16;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V14;uv,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gj4:function(a){return a.uv},
 sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.uv).wM(b)},"$1","gvC",2,0,17,84],
 static:{chF:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10833,10 +10410,10 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.rU.ZL(a)
-C.rU.XI(a)
+C.to.ZL(a)
+C.to.XI(a)
 return a}}},
-V16:{
+V14:{
 "^":"uL+Pi;",
 $isd3:true},
 uE:{
@@ -10855,10 +10432,10 @@
 C.Rr.XI(a)
 return a}}},
 Zn:{
-"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V15;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{xK:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10871,15 +10448,15 @@
 C.ij.ZL(a)
 C.ij.XI(a)
 return a}}},
-V17:{
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 n5:{
-"^":"V18;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V16;h1,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHy:function(a){return a.h1},
 sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,20,91],
-static:{NZ:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.h1).wM(b)},"$1","gvC",2,0,17,84],
+static:{xx:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -10891,14 +10468,14 @@
 C.aV.ZL(a)
 C.aV.XI(a)
 return a}}},
-V18:{
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ma:{
-"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V17;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{Ii:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10911,7 +10488,7 @@
 C.iR.ZL(a)
 C.iR.XI(a)
 return a}}},
-V19:{
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 wN:{
@@ -10926,17 +10503,17 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.J0.ZL(a)
-C.J0.XI(a)
+C.RVQ.ZL(a)
+C.RVQ.XI(a)
 return a}}},
 ds:{
-"^":"V20;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V18;wT,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gMZ:function(a){return a.wT},
 sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,20,91],
-Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,18],
+RF:[function(a,b){J.LE(a.wT).wM(b)},"$1","gvC",2,0,17,84],
+Yk:[function(a){J.LE(a.wT).wM(new E.Gf(a))},"$0","guT",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -10954,19 +10531,19 @@
 C.wP.ZL(a)
 C.wP.XI(a)
 return a}}},
-V20:{
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 Gf:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true},
 ou:{
-"^":"V21;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V19;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gjx:function(a){return a.Cr},
 sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,17,84],
 static:{dv:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -10979,13 +10556,13 @@
 C.lX.ZL(a)
 C.lX.XI(a)
 return a}}},
-V21:{
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 av:{
 "^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
+sEQ:function(a,b){a.CB=this.ct(a,C.fV,a.CB,b)},
 static:{R7:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11004,14 +10581,14 @@
 "^":"xI+Pi;",
 $isd3:true},
 uz:{
-"^":"V22;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V20;RX,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gNN:function(a){return a.RX},
 Fn:function(a){return this.gNN(a).$0()},
 sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,20,91],
-Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,18],
+RF:[function(a,b){J.LE(a.RX).wM(b)},"$1","gvC",2,0,17,84],
+Yk:[function(a){J.LE(a.RX).wM(new E.Cc(a))},"$0","guT",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.mZ=P.cH(P.ii(0,0,0,0,0,1),this.guT(a))},
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.guT(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.mZ
@@ -11029,13 +10606,13 @@
 C.bZ.ZL(a)
 C.bZ.XI(a)
 return a}}},
-V22:{
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 Cc:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.cH(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
 $isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
@@ -11061,7 +10638,7 @@
 if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.WA)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+this.ki=G.dj(z.gAv(),this.YK.Av)}else{if(J.xC(J.Iz(y.gtT(z)),C.wV)||J.xC(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
 else this.Zn=H.d(J.Iz(y.gtT(z)))+" (Function)"
 if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
 else this.vs=G.dj(z.gAv(),d.H.gAv())
@@ -11076,7 +10653,7 @@
 z.mW(a,b,c,d)
 return z}}},
 kK:{
-"^":"V23;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,AQ,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V21;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gB1:function(a){return a.ix},
 sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
 gPL:function(a){return a.fv},
@@ -11118,25 +10695,31 @@
 a.zo=this.ct(a,C.aH,a.zo,v)
 J.aT(a.ix).N3(a.ix)
 J.kW(a.ix,"threshold",z)
-this.Dq(a)},"$1","gd0",2,0,20,57],
+this.Dq(a)},"$1","gd0",2,0,17,54],
 q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
 this.Dq(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,54],
 RF:[function(a,b){var z="profile?tags="+H.d(a.VH)
-J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,20,91],
+J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,17,84],
 Dq:function(a){if(a.ix==null)return
 this.a8(a)},
-a8:function(a){var z,y,x,w,v
+a8:function(a){var z,y,x,w,v,u,t
 z=J.aT(a.ix).gBC()
 if(z==null)return
-try{a.Hm.rT(X.SJ(a.ix,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
+try{w=a.Hm
+v=X.SJ(a.ix,z,z,null)
+w=w.WT
+u=J.w1(w)
+u.V1(w)
+v.C4(0)
+u.FV(w,v.ks)}catch(t){w=H.Ru(t)
+y=w
+x=new H.XO(t,null)
 N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.WT),1))a.Hm.qU(0)
 this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,92,88],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,92,88],
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,126,81],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,126,81],
 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
@@ -11147,7 +10730,7 @@
 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],
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,116,1,89,90],
 static:{"^":"B6",os:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11162,20 +10745,20 @@
 a.fJ=""
 a.XX=0.0002
 a.VH="uv"
-a.AQ="#tableTree"
+a.EX="#tableTree"
 a.on=z
 a.BA=y
 a.LL=w
 C.kS.ZL(a)
 C.kS.XI(a)
 return a}}},
-V23:{
+V21:{
 "^":"uL+Pi;",
 $isd3:true},
 Xy:{
-"^":"Tp:127;a",
+"^":"Tp:114;a",
 $1:[function(a){var z=this.a
-z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,138,"call"],
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,127,"call"],
 $isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
 oa:{
@@ -11195,10 +10778,10 @@
 return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
 "^":"",
 St:{
-"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V22;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{N5:function(a){var z,y,x,w
+static:{JR:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11207,19 +10790,19 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.B2.ZL(a)
-C.B2.XI(a)
+C.Hj.ZL(a)
+C.Hj.XI(a)
 return a}}},
-V24:{
+V22:{
 "^":"uL+Pi;",
 $isd3:true},
 IW:{
-"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V23;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,139,14],
-jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,139,14],
-static:{dmb:function(a){var z,y,x,w
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,128,11],
+jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,128,11],
+static:{dm:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11231,19 +10814,19 @@
 C.F2.ZL(a)
 C.F2.XI(a)
 return a}}},
-V25:{
+V23:{
 "^":"uL+Pi;",
 $isd3:true},
 GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 Qh:{
-"^":"V26;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V24;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{Qj:function(a){var z,y,x,w
@@ -11258,11 +10841,11 @@
 C.kd.ZL(a)
 C.kd.XI(a)
 return a}}},
-V26:{
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
 Oz:{
-"^":"V27;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V25;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ow},
 sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
 static:{RP:function(a){var z,y,x,w
@@ -11277,7 +10860,7 @@
 C.Ji.ZL(a)
 C.Ji.XI(a)
 return a}}},
-V27:{
+V25:{
 "^":"uL+Pi;",
 $isd3:true},
 vT:{
@@ -11295,7 +10878,7 @@
 u.$builtinTypeInfo=[null]
 z.V7("addRow",[u])}}},
 YA:{
-"^":"V28;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V26;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gXE:function(a){return a.wd},
 sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
 ci:[function(a,b){var z,y,x
@@ -11309,7 +10892,7 @@
 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],
+z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,17,54],
 static:{BP:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11322,40 +10905,40 @@
 C.wQ.ZL(a)
 C.wQ.XI(a)
 return a}}},
-V28:{
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
-If:{
-"^":"a;XG,YT",
+EN:{
+"^":"a;X6,YT",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.XG.Yb
+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.et(a.gaf(),"Idle")
+w=J.UU(a.gaf(),"Idle")
 v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
+for(u=0;u<a.gFw().length;++u){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
 s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 r=y[u].wZ
 if(r===0){q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
+while(!0){y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 if(!(q<y[u].XE.length))break
 c$1:{if(q===w)break c$1
-y=a.glI()
+y=a.gFw()
 if(u>=y.length)return H.e(y,u)
 y=y[u].XE
 if(q>=y.length)return H.e(y,q)
@@ -11365,41 +10948,40 @@
 y.$builtinTypeInfo=[null]
 z.V7("addRow",[y])}}},
 qk:{
-"^":"V29;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V27;ck,ts,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 god:function(a){return a.ck},
 sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
 vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
+return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,85,86],
+Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,15],
 q0:function(a){Z.uL.prototype.q0.call(this,a)
-a.ts=P.cH(P.ii(0,0,0,0,0,1),this.gJD(a))},
+a.ts=P.ww(P.ii(0,0,0,0,0,1),this.gJD(a))},
 Nz:function(a){var z
 Z.uL.prototype.Nz.call(this,a)
 z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,20,91],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,139,14],
-jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,139,14],
-static:{KM:function(a){var z,y,x,w,v
+if(z!=null)z.ed()},
+RF:[function(a,b){J.LE(a.ck).wM(b)},"$1","gvC",2,0,17,84],
+Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,128,11],
+jh:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,128,11],
+static:{Za:function(a){var z,y,x,w,v
 z=P.zV(J.UQ($.BY,"DataTable"),null)
 y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
 w=P.qU
 v=W.h4
 v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
-a.LR=new L.If(new G.Kf(z),null)
+a.LR=new L.EN(new G.Kf(z),null)
 a.on=y
 a.BA=x
 a.LL=v
 C.Xe.ZL(a)
 C.Xe.XI(a)
 return a}}},
-V29:{
+V27:{
 "^":"uL+Pi;",
 $isd3:true},
 LX:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 y=z.LR
@@ -11411,15 +10993,15 @@
 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.XG)}if(z.ts!=null)z.ts=P.cH(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,140,"call"],
+y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}z.ts=P.ww(P.ii(0,0,0,0,0,1),J.dq(z))},"$1",null,2,0,null,129,"call"],
 $isEH:true},
 CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,123,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return J.LE(this.a.ck)},"$1",null,2,0,null,110,"call"],
 $isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 xh:{
@@ -11473,7 +11055,7 @@
 u=x.vM+=typeof v==="string"?v:H.d(v)
 x.vM=u+"\n"}}z.Rz(0,a)}},
 vj:{
-"^":"V30;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V28;Ly,cs,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gIr:function(a){return a.Ly},
 ez:function(a,b){return this.gIr(a).$1(b)},
 sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
@@ -11488,7 +11070,7 @@
 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],
+a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,17,54],
 static:{M7:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11501,7 +11083,7 @@
 C.Yt.ZL(a)
 C.Yt.XI(a)
 return a}}},
-V30:{
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
@@ -11522,12 +11104,12 @@
 return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 CX:{
-"^":"V31;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V29;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.iI},
 sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,20,91],
-static:{Dc:function(a){var z,y,x,w
+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,85,86],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,17,84],
+static:{as:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11539,7 +11121,7 @@
 C.MG.ZL(a)
 C.MG.XI(a)
 return a}}},
-V31:{
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -11570,10 +11152,10 @@
 v=J.Lp(v)}else N.QM("").cB(w)}},
 X2:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
-Aw:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.Aw(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.t4,a,b,c)},
+J4:function(a){return this.dL(a,null,null)},
+ZW:function(a,b,c){return this.Y6(C.IF,a,b,c)},
+To:function(a){return this.ZW(a,null,null)},
 xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
 WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
@@ -11588,9 +11170,9 @@
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isRw:true,
-static:{"^":"KT",QM:function(a){return $.tQ().to(a,new N.dG(a))}}},
+static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:69;a",
+"^":"Tp:66;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 '.'"))
@@ -11624,39 +11206,39 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,Fn,hlK,zE,JYn,lDu,uxc"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lDu,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
+"^":"a;OR<,G1>,Mw,Fl<,O0,kc>,I4<",
+bu:function(a){return"["+this.OR.oc+"] "+this.Mw+": "+this.G1},
 $isHV:true,
 static:{"^":"Y1"}}}],["","main.dart",,F,{
 "^":"",
 E2:function(){var z,y
 N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e384())
+N.QM("").gSZ().yI(new F.e377())
 N.QM("").To("Starting Observatory")
 N.QM("").To("Loading Google Charts API")
 z=J.UQ($.ca(),"google")
 y=$.Ib()
 z.V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
-$.Ib().MM.ml(G.vN()).ml(new F.e385())},
-e384:{
-"^":"Tp:142;",
+$.Ib().MM.ml(G.vN()).ml(new F.e378())},
+e377:{
+"^":"Tp:131;",
 $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,141,"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,130,"call"],
 $isEH:true},
-e385:{
-"^":"Tp:13;",
+e378:{
+"^":"Tp:10;",
 $1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
+A.YK()},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 md:{
-"^":"V32;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V30;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 giC:function(a){return a.i4},
 siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
 static:{DCi:function(a){var z,y,x,w
@@ -11672,18 +11254,18 @@
 C.kD.ZL(a)
 C.kD.XI(a)
 return a}}},
-V32:{
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
 Bm:{
-"^":"V33;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V31;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{EG:function(a){var z,y,x,w
+static:{yU:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11698,16 +11280,16 @@
 C.SU.ZL(a)
 C.SU.XI(a)
 return a}}},
-V33:{
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
 Ya:{
-"^":"V34;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V32;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gPj:function(a){return a.KU},
 sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
 gdU:function(a){return a.V4},
 sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{JR:function(a){var z,y,x,w
+static:{vn:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11721,11 +11303,11 @@
 C.nn.ZL(a)
 C.nn.XI(a)
 return a}}},
-V34:{
+V32:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":"V35;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V33;rU,SB,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gFR:function(a){return a.rU},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
@@ -11734,11 +11316,11 @@
 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)},
-VV:[function(a,b,c,d){var z=a.SB
+Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,100,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
+if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,88,1,89,90],
+rT:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,15],
 static:{ZC:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11753,29 +11335,11 @@
 C.J7.ZL(a)
 C.J7.XI(a)
 return a}}},
-V35:{
+V33:{
 "^":"uL+Pi;",
 $isd3:true},
-ye:{
-"^":"uL;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-HN:[function(a,b,c,d){$.W5.toString
-window.history.go(1)},"$3","gWc",6,0,93,1,94,95],
-PH:[function(a,b,c,d){$.W5.toString
-window.history.go(-1)},"$3","gSk",6,0,93,1,94,95],
-static:{W1:function(a){var z,y,x,w
-z=$.XZ()
-y=P.YM(null,null,null,P.qU,W.I0)
-x=P.qU
-w=W.h4
-w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
-a.on=z
-a.BA=y
-a.LL=w
-C.pl.ZL(a)
-C.pl.XI(a)
-return a}}},
 G1:{
-"^":"V36;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V34;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 static:{J8:function(a){var z,y,x,w
@@ -11791,21 +11355,21 @@
 C.lx.ZL(a)
 C.lx.XI(a)
 return a}}},
-V36:{
+V34:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":"V37;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V35;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 grZ:function(a){return a.Jo},
 srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
 god:function(a){return a.iy},
 sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
-Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,20,57],
+vD:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,54],
 gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
+if(z!=null)return z.gHP()
 else return""},
 su6:function(a,b){},
-static:{zf:function(a){var z,y,x,w
+static:{Du:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11818,11 +11382,11 @@
 C.uF.ZL(a)
 C.uF.XI(a)
 return a}}},
-V37:{
+V35:{
 "^":"uL+Pi;",
 $isd3:true},
 UK:{
-"^":"V38;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V36;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gHt:function(a){return a.VW},
 sHt:function(a,b){a.VW=this.ct(a,C.EV,a.VW,b)},
 grZ:function(a){return a.Jo},
@@ -11840,11 +11404,11 @@
 C.ct.ZL(a)
 C.ct.XI(a)
 return a}}},
-V38:{
+V36:{
 "^":"uL+Pi;",
 $isd3:true},
 wM:{
-"^":"V39;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V37;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gRu:function(a){return a.Au},
 sRu:function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},
 grZ:function(a){return a.Jo},
@@ -11862,30 +11426,27 @@
 C.HR.ZL(a)
 C.HR.XI(a)
 return a}}},
-V39:{
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 F1:{
-"^":"V40;qC,i6,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V38;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gzj:function(a){return a.qC},
 szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-q0:function(a){var z,y
+giJ:function(a){return a.yT},
+siJ:function(a,b){a.yT=this.ct(a,C.j2,a.yT,b)},
+q0:function(a){var z
 Z.uL.prototype.q0.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.bl(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.ng("/vm",null,null,null,null,null),y,null,a,null,null,null,null)
-y.E0(a)
-a.i6=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
-y.md()
-y.SC()
-y=new G.mL(z,null,null,new G.ng("/vm",null,null,null,null,null),y,null,a,null,null,null,null)
-y.Ty(a)
-a.i6=y}},
-static:{Lu:function(a){var z,y,x,w
+if(a.qC===!0){z=new U.bl(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z.md()
+z.PI()
+z=new G.mL(new G.hq(null,"",null,null),z,null,null,null,null,null)
+z.hq()
+a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new G.mL(new G.hq(null,"",null,null),U.bU(),null,null,null,null,null)
+z.US()
+a.yT=this.ct(a,C.j2,a.yT,z)}},
+static:{JT8:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -11898,33 +11459,30 @@
 C.k0.ZL(a)
 C.k0.XI(a)
 return a}}},
-V40:{
+V38:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":"xc;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"ir;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 q0:function(a){A.dM.prototype.q0.call(this,a)},
 Nz:function(a){A.dM.prototype.Nz.call(this,a)},
 I9:function(a){A.dM.prototype.I9.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,143,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gwg",2,0,144,145],
 wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,146,147],
-Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,148,149],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,148,149],
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,132,133],
+Ze:[function(a,b){return G.Ef(b)},"$1","gbJ",2,0,12,13],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,134,135],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,134,135],
 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,148,149],
-Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,148,149],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,148,149],
-fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,148,149],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,148,149],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,134,135],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,134,135],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,134,135],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,134,135],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,134,135],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,148,149],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,148,149],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,148,149],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,134,135],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,134,135],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,134,135],
 static:{EE:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -11934,8 +11492,8 @@
 a.on=z
 a.BA=y
 a.LL=w
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
+C.mk.ZL(a)
+C.mk.XI(a)
 return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
 "^":"",
 Ap:{
@@ -11950,8 +11508,8 @@
 z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gcm",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
+k0:[function(a){},"$0","gcm",0,0,15],
+NB:[function(a){a.AP=null},"$0","gym",0,0,15],
 HC:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11959,7 +11517,7 @@
 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,109],
+return!0}return!1},"$0","gDx",0,0,96],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11979,10 +11537,10 @@
 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
+wR:function(){var z,y,x,w,v,u,t,s,r,q
+if($.AM)return
 if($.iq==null)return
-$.Td=!0
+$.AM=!0
 z=0
 y=null
 do{++z
@@ -11993,51 +11551,50 @@
 $.iq=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.HC(0)){if(w)y.push([u,t])
 v=!0}$.iq.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.S5()
+if(w&&v){w=$.eI()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.ax=$.iq.length
-$.Td=!1},
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.iq.length
+$.AM=!1},
 Ht:function(){var z={}
 z.a=!1
 z=new O.Nq(z)
 return new P.yQ(null,null,null,null,new O.u3(z),new O.bF(z),null,null,null,null,null,null)},
 Nq:{
-"^":"Tp:150;a",
+"^":"Tp:136;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",
+"^":"Tp:66;a",
 $0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
+O.wR()},"$0",null,0,0,null,"call"],
 $isEH:true},
 u3:{
-"^":"Tp:30;b",
+"^":"Tp:27;b",
 $4:[function(a,b,c,d){if(d==null)return d
-return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
+return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
 $isEH:true},
 yJ:{
-"^":"Tp:69;c,d,e,f",
+"^":"Tp:66;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:151;UI",
+"^":"Tp:137;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"],
+return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,24,25,26,28,"call"],
 $isEH:true},
 f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
+"^":"Tp:10;bK,Gq,Rm,w3",
 $1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
+return this.w3.$1(a)},"$1",null,2,0,null,62,"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
@@ -12195,7 +11752,7 @@
 y=J.ew(z,u.Uj.G4.length)
 x=q.jr
 p=P.J(y,J.ew(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){C.Nm.W4(a,r);--r
 z=J.Hn(q.dM,q.Uj.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -12259,7 +11816,7 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
+ndx:{
 "^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
@@ -12269,56 +11826,9 @@
 return d},
 d3:{
 "^":"a;",
-gqh:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-hb:[function(){var z,y,x,w,v
-z=$.iq
-if(z==null){z=H.VM([],[F.d3])
-$.iq=z}z.push(this)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(x=H.dJ(this),z=$.mX().Me(0,new H.cu(x,null),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();){w=J.O6(z.lo)
-v=$.cp().eA.t(0,w)
-if(v==null)H.vh(O.lA("getter \""+H.d(w)+"\" in "+this.bu(0)))
-y.u(0,w,v.$1(this))}this.V2=y},"$0","gFW",0,0,18],
-L5:[function(){if(this.V2!=null)this.V2=null},"$0","gkk",0,0,18],
-HC:function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.X6(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},
 $isd3:true},
 X6:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z,y,x,w,v
 z=this.b
 y=$.cp().jD(z,a)
@@ -12333,9 +11843,9 @@
 "^":"",
 Sk:{
 "^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.zdr,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,{
+gP:function(a){return this.u1},
+sP:function(a,b){this.u1=F.Wi(this,C.zdr,this.u1,b)},
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
 "^":"uFU;b3@,iT,ao,AP,fn",
@@ -12358,7 +11868,7 @@
 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=new H.nH(z,b,y)
 x.$builtinTypeInfo=[null]
 if(b<0)H.vh(P.N(b))
 if(y<0)H.vh(P.N(y))
@@ -12396,7 +11906,7 @@
 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.j5(z,b,y,null).br(0)))}H.Lm(this.ao,b,c)},
+this.iH(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.aB(this.ao,b,c)},
 h:function(a,b){var z,y,x,w
 z=this.ao
 y=z.length
@@ -12435,7 +11945,7 @@
 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=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(P.N(b))
 if(c<0)H.vh(P.N(c))
@@ -12454,7 +11964,7 @@
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.Lm(z,b,c)
+H.aB(z,b,c)
 this.On(x,z.length)
 z=this.iT
 if(z!=null){w=z.iE
@@ -12500,7 +12010,7 @@
 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,109],
+return!0}return!1},"$0","gL6",0,0,96],
 $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
@@ -12537,7 +12047,7 @@
 "^":"rm+Pi;",
 $isd3:true},
 cj:{
-"^":"Tp:69;a",
+"^":"Tp:66;a",
 $0:function(){this.a.iT=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
@@ -12595,17 +12105,17 @@
 return z}}},
 zT:{
 "^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,76,21,"call"],
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,70,18,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:75;a",
+"^":"Tp:69;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;fq,Pc,op,Vq,dS",
+"^":"Ap;fq,Pc,cl,Vq,dS",
 QI:function(a){return this.Pc.$1(a)},
 EO:function(a){return this.Vq.$1(a)},
 TR:function(a,b){var z
@@ -12616,12 +12126,12 @@
 jA:[function(a){var z=this.QI(a)
 if(J.xC(z,this.dS))return
 this.dS=z
-return this.EO(z)},"$1","gv7",2,0,13,58],
+return this.EO(z)},"$1","gv7",2,0,10,55],
 S6:function(a){var z=this.fq
 if(z!=null)J.x0(z)
 this.fq=null
 this.Pc=null
-this.op=null
+this.cl=null
 this.Vq=null
 this.dS=null},
 gP:function(a){var z=this.QI(J.Vm(this.fq))
@@ -12632,7 +12142,7 @@
 yf: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
+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).$isIN){z=a
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
@@ -12645,14 +12155,14 @@
 z=x.$1(z)
 return z}catch(w){if(!!J.x(H.Ru(w)).$isJS){z=J.bB(a)
 v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Br()
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},
 iu:function(a,b,c){var z,y,x
 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
+return!0}}else if(!!J.x(b).$isIN){z=a
 y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
 if(!y){z=a
 y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
@@ -12660,7 +12170,7 @@
 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.bB(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Br()
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.T5()
 if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
 return!1},
 cB:function(a){a=J.rr(a)
@@ -12669,49 +12179,49 @@
 if(a[0]===".")return!1
 return $.tN().zD(a)},
 WR:{
-"^":"AR;I3,pn,LG,jR,xX,jB,PV",
-geg:function(){return this.I3==null},
-sP:function(a,b){var z=this.I3
-if(z!=null)z.rL(this.pn,b)},
-gX6:function(){return 2},
+"^":"AR;yc,XF,xE,Fs,GX,W8,Wf",
+gqc:function(){return this.yc==null},
+sP:function(a,b){var z=this.yc
+if(z!=null)z.rL(this.XF,b)},
+gFH:function(){return 2},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){this.LG=L.SE(this,this.pn)
-this.Oq(!0)},
-fV:function(){this.PV=null
-this.I3=null
-this.pn=null},
-GA:function(a){this.I3.u8(this.pn,a)},
-Oq:function(a){var z,y
-z=this.PV
-y=this.I3.Tl(this.pn)
-this.PV=y
+NJ:function(){this.xE=L.SE(this,this.XF)
+this.hQ(!0)},
+kH:function(){this.Wf=null
+this.yc=null
+this.XF=null},
+nf:function(a){this.yc.VV(this.XF,a)},
+hQ:function(a){var z,y
+z=this.Wf
+y=this.yc.Tl(this.XF)
+this.Wf=y
 if(a||J.xC(y,z))return!1
-this.WP(this.PV,z)
+this.zc(this.Wf,z)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 Tv:{
-"^":"a;Ih",
-gB:function(a){return this.Ih.length},
-gl0:function(a){return this.Ih.length===0},
+"^":"a;Ld",
+gB:function(a){return this.Ld.length},
+gl0:function(a){return this.Ld.length===0},
 gPu:function(){return!0},
 bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+return H.VM(new H.lJ(this.Ld,new L.f7()),[null,null]).zV(0,".")},
 n:function(a,b){var z,y,x,w,v
 if(b==null)return!1
 if(this===b)return!0
 if(!J.x(b).$isTv)return!1
 if(this.gPu()!==b.gPu())return!1
-z=this.Ih
+z=this.Ld
 y=z.length
-x=b.Ih
+x=b.Ld
 if(y!==x.length)return!1
 for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=z[w]
 if(w>=x.length)return H.e(x,w)
 if(!J.xC(v,x[w]))return!1}return!0},
 giO:function(a){var z,y,x,w,v
-for(z=this.Ih,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
+for(z=this.Ld,y=z.length,x=0,w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
 v=J.v1(z[w])
 if(typeof v!=="number")return H.s(v)
 x=536870911&x+v
@@ -12721,20 +12231,20 @@
 return 536870911&x+((16383&x)<<15>>>0)},
 Tl:function(a){var z,y
 if(!this.gPu())return
-for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+for(z=this.Ld,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 if(a==null)return
 a=L.yf(a,y)}return a},
 rL:function(a,b){var z,y,x
-z=this.Ih
+z=this.Ld
 y=z.length-1
 if(y<0)return!1
 for(x=0;x<y;++x){if(a==null)return!1
 if(x>=z.length)return H.e(z,x)
 a=L.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
 return L.iu(a,z[y],b)},
-u8:function(a,b){var z,y,x,w
-if(!this.gPu()||this.Ih.length===0)return
-z=this.Ih
+VV:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ld.length===0)return
+z=this.Ld
 y=z.length-1
 for(x=0;a!=null;x=w){b.$1(a)
 if(x>=y)break
@@ -12747,8 +12257,8 @@
 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((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+w=$.fX().t(0,a)
 if(w!=null)return w
 if(!L.cB(a))return $.V6()
 v=[]
@@ -12759,7 +12269,7 @@
 if(J.xC(x,""))continue
 t=H.BU(x,10,new L.oq())
 v.push(t!=null?t:$.b7().I1.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
+y=$.fX()
 if(y.X5>=100){y.toString
 u=new P.i5(y)
 u.$builtinTypeInfo=[H.Kp(y,0)]
@@ -12768,145 +12278,145 @@
 y.Rz(0,s.gl())}y.u(0,a,w)
 return w}}},
 oq:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $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,152,"call"],
+"^":"Tp:10;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().ep.t(0,a):a},"$1",null,2,0,null,138,"call"],
 $isEH:true},
 Ul:{
-"^":"Tv;Ih",
+"^":"Tv;Ld",
 gPu:function(){return!1},
 static:{"^":"qr"}},
 MdQ:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $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:{
-"^":"AR;LG,Bg,jR,xX,jB,PV",
-geg:function(){return this.Bg==null},
-gX6:function(){return 3},
+NV:{
+"^":"AR;xE,TV,Fs,GX,W8,Wf",
+gqc:function(){return this.TV==null},
+gFH:function(){return 3},
 TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
-BB:function(){var z,y,x,w
-this.Oq(!0)
-for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+NJ:function(){var z,y,x,w
+this.hQ(!0)
+for(z=this.TV,y=z.length,x=0;x<y;x+=2){w=z[x]
 if(w!==C.dV){z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?w!=null:y!==w}else y=!0
 if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,this.jR,this)
-this.GA(z.gTT())
-this.LG=null
+$.xG=z}z.Nl.u(0,this.Fs,this)
+this.nf(z.gTT())
+this.xE=null
 break}}},
-fV:function(){var z,y,x,w
-this.PV=null
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+kH:function(){var z,y,x,w
+this.Wf=null
+for(z=0;y=this.TV,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
 if(w>=x)return H.e(y,w)
-J.x0(y[w])}this.Bg=null},
+J.x0(y[w])}this.TV=null},
 yN:function(a,b){var z
-if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(this.GX!=null||this.TV==null)throw H.b(P.w("Cannot add paths once started."))
 if(!J.x(b).$isTv)b=L.hk(b)
-z=this.Bg
+z=this.TV
 z.push(a)
 z.push(b)},
 ti:function(a){return this.yN(a,null)},
-GA:function(a){var z,y,x,w,v
-for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+nf:function(a){var z,y,x,w,v
+for(z=0;y=this.TV,x=y.length,z<x;z+=2){w=y[z]
 if(w!==C.dV){v=z+1
 if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").u8(w,a)}}},
-Oq:function(a){var z,y,x,w,v,u,t,s,r
-J.Vw(this.PV,C.jn.cU(this.Bg.length,2))
-for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+H.Go(y[v],"$isTv").VV(w,a)}}},
+hQ:function(a){var z,y,x,w,v,u,t,s,r
+J.Vw(this.Wf,C.jn.cU(this.TV.length,2))
+for(z=!1,y=null,x=0;w=this.TV,v=w.length,x<v;x+=2){u=x+1
 if(u>=v)return H.e(w,u)
 t=w[u]
 s=w[x]
 if(s===C.dV){H.Go(t,"$isAp")
 r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.PV,C.jn.cU(x,2),r)
-continue}w=this.PV
+if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
+continue}w=this.Wf
 v=C.jn.cU(x,2)
 if(J.xC(r,J.UQ(w,v)))continue
-w=this.jB
+w=this.W8
 if(typeof w!=="number")return w.F()
 if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.PV,v))}J.kW(this.PV,v,r)
+y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
 z=!0}if(!z)return!1
-this.JQ(this.PV,y,w)
+this.Aw(this.Wf,y,w)
 return!0},
-Pz:function(){return this.Oq(!1)},
+lI:function(){return this.hQ(!1)},
 $isAp:true},
 iNc:{
 "^":"a;"},
 AR:{
-"^":"Ap;jR<",
-d9:function(){return this.xX.$0()},
-hM:function(a){return this.xX.$1(a)},
-Lt:function(a,b){return this.xX.$2(a,b)},
-KN:function(a,b,c){return this.xX.$3(a,b,c)},
-gcF:function(){return this.xX!=null},
-TR:function(a,b){if(this.xX!=null||this.geg())throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
-this.xX=b
-this.jB=P.J(this.gX6(),X.Zpg(b))
-this.BB()
-return this.PV},
-gP:function(a){this.Oq(!0)
-return this.PV},
-S6:function(a){if(this.xX==null)return
-this.fV()
-this.PV=null
-this.xX=null},
-di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,20,14],
-Fe:function(){var z=0
-while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
-JQ:function(a,b,c){var z,y,x,w
-try{switch(this.jB){case 0:this.d9()
+"^":"Ap;Fs<",
+TI:function(){return this.GX.$0()},
+K0:function(a){return this.GX.$1(a)},
+tH:function(a,b){return this.GX.$2(a,b)},
+Mm:function(a,b,c){return this.GX.$3(a,b,c)},
+gL9:function(){return this.GX!=null},
+TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
+if(X.OS(b)>this.gFH())throw H.b(P.u("callback should take "+this.gFH()+" or fewer arguments"))
+this.GX=b
+this.W8=P.J(this.gFH(),X.Zpg(b))
+this.NJ()
+return this.Wf},
+gP:function(a){this.hQ(!0)
+return this.Wf},
+S6:function(a){if(this.GX==null)return
+this.kH()
+this.Wf=null
+this.GX=null},
+xVs:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,17,11],
+SG:function(){var z=0
+while(!0){if(!(z<1000&&this.lI()))break;++z}return z>0},
+Aw:function(a,b,c){var z,y,x,w
+try{switch(this.W8){case 0:this.TI()
 break
-case 1:this.hM(a)
+case 1:this.K0(a)
 break
-case 2:this.Lt(a,b)
+case 2:this.tH(a,b)
 break
-case 3:this.KN(a,b,c)
+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)}},
-WP:function(a,b){return this.JQ(a,b,null)}},
+zc:function(a,b){return this.Aw(a,b,null)}},
 zG:{
-"^":"a;zT,R3,ZY,bl,bV",
-TR:function(a,b){this.R3.u(0,b.gjR(),b)
-b.GA(this.gTT())},
+"^":"a;kT,Nl,rS,HN,op",
+TR:function(a,b){this.Nl.u(0,b.gFs(),b)
+b.nf(this.gTT())},
 we:[function(a){var z=J.x(a)
-if(!!z.$iswn)this.Uq(a.gRT())
-if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,153],
-Uq:function(a){var z,y
-if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
-z=this.bl
+if(!!z.$iswn)this.c1(a.gRT())
+if(!!z.$isd3)this.c1(z.gqh(a))},"$1","gTT",2,0,139],
+c1:function(a){var z,y
+if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
+z=this.HN
 y=z!=null?z.Rz(0,a):null
-if(y!=null)this.ZY.u(0,a,y)
-else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+if(y!=null)this.rS.u(0,a,y)
+else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
 CH:[function(a){var z,y,x,w,v
-if(!this.bV)return
-z=this.bl
+if(!this.op)return
+z=this.HN
 if(z==null)z=P.YM(null,null,null,null,null)
-this.bl=this.ZY
-this.ZY=z
-for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.bl=null},"$0","gSI",0,0,18],
-Hi:[function(a){var z,y
-for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.gcF())y.Pz()}this.bV=!0
-P.rb(this.gSI(this))},"$1","gp7",2,0,20,154],
+this.HN=this.rS
+this.rS=z
+for(y=this.Nl,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gL9())v.nf(this.gTT())}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.HN=null},"$0","gSI",0,0,15],
+KO:[function(a){var z,y
+for(z=this.Nl,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gL9())y.lI()}this.op=!0
+P.rb(this.gSI(this))},"$1","gCP",2,0,17,140],
 static:{"^":"xG",SE:function(a,b){var z,y
 z=$.xG
-if(z!=null){y=z.zT
+if(z!=null){y=z.kT
 y=y==null?b!=null:y!==b}else y=!0
 if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.R3.u(0,a.jR,a)
-a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+$.xG=z}z.Nl.u(0,a.Fs,a)
+a.nf(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
 tB:[function(a){var z,y,x
 z=J.x(a)
@@ -12916,13 +12426,13 @@
 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],
+return x}return a},"$1","Ft",2,0,10,18],
 Fk:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-fE:function(a,b){var z,y,x
+Jy:function(a,b){var z,y,x
 for(z=$.mX().Me(0,a,C.Hh),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
 x=J.RE(y)
 if(x.gV5(y)===!0)continue
@@ -12948,13 +12458,13 @@
 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))
+$.Es().J4("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
+fS:[function(a){var z,y
 z=$.b7().ep.t(0,a)
 if(z==null)return!1
-y=J.Qe(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
+y=J.rY(z)
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,59,60],
 Ad:function(a,b){$.Ej().u(0,a,b)
 H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
 xv:function(a){A.VxC(a,new A.Sv())},
@@ -12962,7 +12472,7 @@
 if(a==null)return
 b.$1(a)
 for(z=a.firstChild;z!=null;z=z.nextSibling)A.VxC(z,b)},
-A8s:function(a,b,c){return new A.L6(a,b)},
+pf:function(a,b,c){return new A.L6(a,b)},
 h6:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
@@ -12979,7 +12489,7 @@
 $.AC=!0
 A.JP()
 $.ok=b
-for(a.length,z=H.VM(new H.a7(a,73,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+for(a.length,z=H.VM(new H.a7(a,72,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
 JP:function(){var z,y,x,w,v
 z=J.UQ($.ca(),"Polymer")
 if(z==null)throw H.b(P.w("polymer.js must be loaded before polymer.dart, please add <link rel=\"import\" href=\"packages/polymer/polymer.html\"> to your <head> before any Dart scripts. Alternatively you can get a different version of polymer.js by following the instructions at http://www.polymer-project.org; if you do that be sure to include the platform polyfills."))
@@ -13003,7 +12513,7 @@
 if(z==null)return
 for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
 w=J.RE(x)
-if(J.tx(w.gyT(x)))w.mx(x,document.createElement("content",null))}}},
+if(J.tx(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
 Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
 y=y.gP1()}x=document
@@ -13021,7 +12531,7 @@
 if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
 q=v[r]
 p={}
-p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Gi(s,t),1))}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Xw(s,t),1))}
 p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
 p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
 p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
@@ -13036,7 +12546,7 @@
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
 this.Q7=y}z=this.t5
-this.Q7=A.fE(z,this.Q7)
+this.Q7=A.Jy(z,this.Q7)
 x=J.Vs(this.FL).MW.getAttribute("attributes")
 if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
 if(v==="")continue
@@ -13058,10 +12568,10 @@
 if(y!=null)z.FV(0,y.gkK())
 J.Vs(this.FL).aN(0,new A.eY(this))},
 W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Hs("[rel=stylesheet]")
+Mi:function(){var z=this.Bg("[rel=stylesheet]")
 this.Qk=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
-f6:function(){var z=this.Hs("style[polymer-scope]")
+f6:function(){var z=this.Bg("style[polymer-scope]")
 this.lD=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
 m1:function(){var z,y,x,w,v,u,t
@@ -13082,7 +12592,7 @@
 x=this.gZf()
 if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a){return this.Wz(a,null)},
+Bg:function(a){return this.Wz(a,null)},
 kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.ua("[polymer-scope="+a+"]")
@@ -13116,45 +12626,45 @@
 return z},
 $isXP:true},
 eY:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
 BO:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){var z,y,x
-z=J.Qe(a)
-if(z.nC(a,"on-")){y=J.U6(b).kJ(b,"{{")
+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;",
+"^":"Tp:10;",
 $1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
 ua:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return J.RF(a,this.a)},
 $isEH:true},
 ix:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){return[]},
 $isEH:true},
 Tj:{
-"^":"Tp:155;a",
+"^":"Tp:141;a",
 $2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
 DOe:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
 C.SP.aN(0,new A.xb(z))
 return z},
 $isEH:true},
 xb:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 A2:{
-"^":"nd;"},
+"^":"ndx;"},
 dM:{
 "^":"a;",
 Pa:function(a){var z
@@ -13224,9 +12734,9 @@
 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.bB(w):v)
+u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
 if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,156],
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,142],
 B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
@@ -13248,7 +12758,7 @@
 y=J.RE(z)
 x=y.goc(z)
 w=$.zB()
-if(w.Im(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+if(w.Im(C.t4))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
 w=J.RE(c)
 if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
 v=new A.Bf(a,x,c,null,null)
@@ -13263,13 +12773,13 @@
 Mh:function(a,b){return J.n1(M.Ky(a),b)},
 x3:function(a){var z,y
 if(a.q9===!0)return
-$.UW().Ny("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+$.EM().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
 z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
 else z=new A.S0(null,null)
 z.jd=y
-z.ih=P.cH(C.ny,z.gv6(z))
+z.ih=P.ww(C.ny,z.gv6(z))
 a.YE=z},
 BM:[function(a){var z,y
 if(a.q9===!0)return
@@ -13279,10 +12789,10 @@
 J.DB(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,18],
+y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,15],
 dH:function(a,b){var z
-if(a.q9===!0){$.UW().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+if(a.q9===!0){$.EM().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.EM().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
 z=a.YE
 if(z!=null){z.TP(0)
 a.YE=null}if(b===!0)return
@@ -13295,27 +12805,28 @@
 w=!x
 if(!x||y!=null){x=$.ps
 $.ps=x+1
-v=new L.ww(null,[],x,null,null,null)
-v.PV=[]
+v=new L.NV(null,[],x,null,null,null)
+v.Wf=[]
 a.JB=v
 if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
 v.yN(a,t)
 this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
 if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
-FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,157],
+FQ:[function(a,b,c,d){J.kH(c,new A.qz(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,143],
 rJ:function(a,b,c,d){var z,y,x,w,v
 z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
 if(!!J.x(d).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
 this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
-if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+if(x.Im(C.t4))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gRT().w4(!1)
-w.yl(new A.V1(a,d,y))
-w.fm(0,null)
-w.y5(null)
+x=w.Lj
+w.pN=x.wY(new A.V1(a,d,y))
+w.o7=P.VH(P.Mm(),x)
+w.Bd=x.Al(P.od())
 x=H.d(b)+"__array"
 v=a.nh
 if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
@@ -13333,8 +12844,8 @@
 z=a.a6.gPS()
 if(z.gl0(z))return
 y=$.Uk()
-if(y.Im(C.eI))y.Ny("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
-this.UH(a,a,z.gvc(),this.gay(a))},
+if(y.Im(C.t4))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+this.UH(a,a,z.gvc(),this.gD4(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
@@ -13348,18 +12859,18 @@
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
 y=$.Uk()
-x=y.Im(C.eI)
-if(x)y.Ny(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+x=y.Im(C.t4)
+if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
 w=a.a6.gPS()
 v=z.gt5(b)
 u=J.UQ($.pT(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.Ny("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.Ny("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gay",2,0,158,2],
+if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,144,78],
 ea:function(a,b,c,d){var z,y,x,w
 z=$.Uk()
-y=z.Im(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
+y=z.Im(C.t4)
+if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
 if(!!J.x(c).$isEH){x=X.Zpg(c)
 if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
 C.Nm.sB(d,x)
@@ -13373,26 +12884,26 @@
 $isPZ:true,
 $isKV:true},
 dZ:{
-"^":"Tp:75;a",
+"^":"Tp:69;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",
+"^":"Tp:66;b",
 $0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){var z=J.x(a)
 if(!!z.$isdM)z.oW(a)},
 $isEH:true},
 Sv:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.DB(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
 qz:{
-"^":"Tp:75;a,b,c,d,e,f,UI",
+"^":"Tp:69;a,b,c,d,e,f,UI",
 $2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
 if(typeof a!=="number")return H.s(a)
@@ -13409,28 +12920,28 @@
 if(!q.h(0,p))continue
 o=u.t(v,a)
 s.rJ(t,x,o,b)
-$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,82,57,"call"],
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,145,54,"call"],
 $isEH:true},
 V1:{
-"^":"Tp:13;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:[function(a){var z,y,x,w
 for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,159,"call"],
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 L6:{
-"^":"Tp:163;a,b",
+"^":"Tp:150;a,b",
 $3:[function(a,b,c){var z,y,x
 z=$.Uk()
-if(z.Im(C.eI))z.Ny("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+if(z.Im(C.t4))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
 x=C.SP.t(0,y)
 if(x!=null)y=x
-return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,160,161,162,"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 Bf:{
 "^":"Ap;I6,iU,jz,Jq,dY",
 AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,55],
 ho:[function(a){var z,y,x,w,v
 for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
 if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
@@ -13439,7 +12950,7 @@
 v=w.$1(z)
 z=this.dY
 if(z==null?v!=null:z!==v)J.Fc(this.jz,v)
-return}}},"$1","gXQ",2,0,164,154],
+return}}},"$1","gXQ",2,0,151,140],
 TR:function(a,b){return J.mu(this.jz,b)},
 gP:function(a){return J.Vm(this.jz)},
 sP:function(a,b){J.Fc(this.jz,b)
@@ -13447,7 +12958,7 @@
 S6:function(a){var z=this.Jq
 if(z!=null){z.ed()
 this.Jq=null}J.x0(this.jz)}},
-xc:{
+ir:{
 "^":"Ot;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
@@ -13475,11 +12986,11 @@
 $isd3:true},
 N9:{
 "^":"uN;jw",
-pm:function(a,b,c){if(J.co(b,"on-"))return A.A8s(a,b,c)
+pm:function(a,b,c){if(J.co(b,"on-"))return A.pf(a,b,c)
 return T.uN.prototype.pm.call(this,a,b,c)}},
 zI:{
 "^":"Ap;v3,pB,U1,ED,Jq",
-zU:[function(a){var z,y,x,w,v,u
+cE:[function(a){var z,y,x,w,v,u
 z=this.v3
 y=A.tT(z)
 x=J.x(y)
@@ -13488,7 +12999,7 @@
 if(C.xB.nC(w,"@")){v=this.U1
 w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
 u=J.x(a)
-x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,13,2],
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,78],
 gP:function(a){return},
 TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
 z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
@@ -13496,7 +13007,7 @@
 this.Jq=z},
 S6:function(a){var z
 if(this.Jq!=null){z=$.Uk()
-if(z.Im(C.eI))z.Ny("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+if(z.Im(C.t4))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
 this.Jq.ed()
 this.Jq=null}},
 static:{tT:function(a){var z
@@ -13509,26 +13020,26 @@
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,18]},
+this.Ws()}},"$0","gv6",0,0,15]},
 mS:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
 $isEH:true},
 hp:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:[function(){var z=$.ln().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
 return},"$0",null,0,0,null,"call"],
 $isEH:true},
 k2:{
-"^":"Tp:167;a,b",
+"^":"Tp:154;a,b",
 $3:[function(a,b,c){var z=$.Ej().t(0,b)
 if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,165,56,166,"call"],
+return this.b.qP([b,c],a)},"$3",null,6,0,null,152,53,153,"call"],
 $isEH:true},
 v4:{
-"^":"Tp:69;c,d,e,f",
+"^":"Tp:66;c,d,e,f",
 $0:[function(){var z,y,x,w,v,u
 z=this.d
 y=this.e
@@ -13562,57 +13073,57 @@
 return y}catch(x){H.Ru(x)
 return a}},
 Md:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a},
 $isEH:true},
 lP:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a},
 $isEH:true},
 Uf:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z,y
 try{z=P.zu(a)
 return z}catch(y){H.Ru(y)
 return b}},
 $isEH:true},
 Ra:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return!J.xC(a,"false")},
 $isEH:true},
 wJY:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return this.a},
 $isEH:true},
 zOQ:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
 Lf:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 dA:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.M2(a.gvc(),new T.o8f(a)).zV(0," ")
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8f(a)).zV(0," ")
 else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","dI",2,0,49,64],
+return z},"$1","dI",2,0,46,61],
 qN:[function(a){var z=J.x(a)
 if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
 else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","xe",2,0,49,64],
-Fm:[function(a){return a},"$1","u2",2,0,13,65],
+return z},"$1","xe",2,0,46,61],
+Fm:[function(a){return a},"$1","u2",2,0,10,62],
 o8f:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
 GL:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,168,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 uN:{
 "^":"VE;",
@@ -13631,7 +13142,7 @@
 return new T.H1(this,b,x)},
 CE:function(a){return new T.uK(this)}},
 H1:{
-"^":"Tp:163;a,b,c",
+"^":"Tp:150;a,b,c",
 $3:[function(a,b,c){var z,y
 if(!J.x(a).$isGK)a=K.xV(a,this.a.jw)
 z=!!J.x(b).$ish4
@@ -13639,103 +13150,103 @@
 if(z&&J.xC(this.b,"style"))y=T.xe()
 if(c===!0)return T.rD(this.c,a,y)
 z=y==null?T.u2():y
-return new T.tI(a,z,this.c,null,null,null)},"$3",null,6,0,null,160,161,162,"call"],
+return new T.tI(a,z,this.c,null,null,null)},"$3",null,6,0,null,147,148,149,"call"],
 $isEH:true},
 uK:{
-"^":"Tp:13;a",
-$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,160,"call"],
+"^":"Tp:10;a",
+$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,147,"call"],
 $isEH:true},
 tI:{
-"^":"Ap;qc,pk,jf,RU,EU,uK",
-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.uK
-y=this.Qv(a)
-this.uK=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.uK)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,169,170,64,171],
-gP:function(a){if(this.RU!=null)return this.uK
-return T.rD(this.jf,this.qc,this.pk)},
+"^":"Ap;yr,wx,n4,Fg,ML,HR",
+R5:function(a){return this.wx.$1(a)},
+WV:function(a){return this.Fg.$1(a)},
+q1:[function(a,b){var z,y
+z=this.HR
+y=this.R5(a)
+this.HR=y
+if(b!==!0&&this.Fg!=null&&!J.xC(z,y))this.WV(this.HR)},function(a){return this.q1(a,!1)},"UV","$2$skipChanges","$1","gQp",2,3,156,157,61,158],
+gP:function(a){if(this.Fg!=null)return this.HR
+return T.rD(this.n4,this.yr,this.wx)},
 sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.jf,b,this.qc)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
+try{z=K.jX(this.n4,b,this.yr)
+this.q1(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.jf)+"': "+H.d(y),x)}},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.n4)+"': "+H.d(y),x)}},
 TR:function(a,b){var z,y,x,w,v,u,t
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-w=this.jf
-v=this.qc
+if(this.Fg!=null)throw H.b(P.w("already open"))
+this.Fg=b
+w=this.n4
+v=this.yr
 u=H.VM(new P.Sw(null,0,0,0),[null])
 u.Eo(null,null)
-z=J.NV(w,new K.Oy(v,u))
-this.jf=z
-u=z.glr().yI(this.gTJ())
+z=J.okV(w,new K.Oy(v,u))
+this.n4=z
+u=z.glr().yI(this.gQp())
 u.fm(0,new T.Tg(z))
-this.EU=u
+this.ML=u
 try{w=z
-J.NV(w,new K.Ed(v))
+J.okV(w,new K.Ed(v))
 w.gXr()
-this.LZ(z.gXr(),!0)}catch(t){w=H.Ru(t)
+this.q1(z.gXr(),!0)}catch(t){w=H.Ru(t)
 y=w
 x=new H.XO(t,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.uK},
-S6:function(a){if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.jf=H.Go(this.jf,"$isdE").KL
-this.RU=null},
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.HR},
+S6:function(a){if(this.Fg==null)return
+this.ML.ed()
+this.ML=null
+this.n4=H.Go(this.n4,"$isdE").KL
+this.Fg=null},
 static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=K.ld(a,b)
+try{z=K.Cw(a,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:75;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,152,"call"],
+"^":"Tp:69;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,138,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.xx(b,this))},
+"^":"Sk;vq,u1,AP,fn",
+vb:function(a,b){this.vq.yI(new B.DH(b,this))},
 $asSk:function(a){return[null]},
 static:{z4:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
-xx:{
+DH:{
 "^":"Tp;a,b",
 $1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.zdr,z.DA,a)},"$1",null,2,0,null,82,"call"],
+z.u1=F.Wi(z,C.zdr,z.u1,a)},"$1",null,2,0,null,145,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-ld:function(a,b){var z,y
+Cw:function(a,b){var z,y
 z=new P.Sw(null,0,0,0)
 z.$builtinTypeInfo=[null]
 z.Eo(null,null)
-y=J.NV(a,new K.Oy(b,z))
-J.NV(y,new K.Ed(b))
+y=J.okV(a,new K.Oy(b,z))
+J.okV(y,new K.Ed(b))
 return y.gLv()},
 jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.x(w),!!v.$isMp;){if(!J.xC(v.gxS(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$iszb;){if(!J.xC(v.gxS(w),"|"))break
 x.push(v.gT8(w))
 z.a=v.gBb(w)}w=z.a
 v=J.x(w)
 if(!!v.$iselO){u=v.gP(w)
 t=C.x4
 s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.$0()
-t=z.a.gTf()
+t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(!!v.$isx9){t=w.gTf()
-u=J.O6(z.a)}else if(!!v.$isNb){t=w.gTf()
-if(J.I1(z.a)!=null){if(z.a.gre()!=null)return
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isNb){t=w.ghP()
+if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
 u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
 t=null
@@ -13743,11 +13254,11 @@
 y=new P.Sw(null,0,0,0)
 y.$builtinTypeInfo=[null]
 y.Eo(null,null)
-q=J.NV(r,new K.Oy(c,y))
-J.NV(q,new K.Ed(c))
+q=J.okV(r,new K.Oy(c,y))
+J.okV(q,new K.Ed(c))
 q.gLv()
-throw H.b(K.zq("filter must implement Transformer: "+H.d(r)))}p=K.ld(t,c)
-if(p==null)return
+throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.Cw(t,c)
+if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
 else{z=$.b7().I1.t(0,u)
 $.cp().Cq(p,z,b)}return b},
@@ -13756,79 +13267,79 @@
 if(b==null)y=z
 else{y=P.L5(null,null,null,P.qU,P.a)
 y.FV(0,b)
-x=new K.PF(z,y)
-if(y.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
+x=new K.Ph(z,y)
+if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
 y=x}return y},
 lPa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.z8(a,b)},
 $isEH:true},
 w12:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.J5(a,b)},
 $isEH:true},
 w13:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.u6(a,b)},
 $isEH:true},
 w14:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Bl(a,b)},
 $isEH:true},
 w15:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a===!0||b===!0},
 $isEH:true},
 w16:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return a===!0&&b===!0},
 $isEH:true},
 w17:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){var z=H.Og(P.a)
-z=H.fH(z,[z]).BD(b)
+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."))},
+throw H.b(K.xn("Filters must be a one-argument function."))},
 $isEH:true},
 w18:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a},
 $isEH:true},
 w19:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return J.jzo(a)},
 $isEH:true},
 w20:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:69;a",
-$0:function(){return H.vh(K.zq("Expression is not assignable: "+H.d(this.a.a)))},
+"^":"Tp:66;a",
+$0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
 GK:{
 "^":"a;",
@@ -13842,7 +13353,7 @@
 if(J.xC(b,"this"))return this.ku
 z=$.b7().I1.t(0,b)
 y=this.ku
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
 y=$.cp().jD(y,z)
 return!!J.x(y).$iscb?B.z4(y,null):y},
 AC:function(a){return!J.xC(a,"this")},
@@ -13856,7 +13367,7 @@
 AC:function(a){if(J.xC(this.Z0,a))return!1
 return this.eT.AC(a)},
 bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-PF:{
+Ph:{
 "^":"GK;eT>,Z3<",
 gku:function(){return this.eT.ku},
 t:function(a,b){var z=this.Z3
@@ -13891,29 +13402,29 @@
 Ed:{
 "^":"cfS;qu",
 xn:function(a){a.OJ(this.qu)},
-ky:function(a){J.NV(a.gT8(a),this)
+ky:function(a){J.okV(a.gT8(a),this)
 a.OJ(this.qu)}},
 Oy:{
 "^":"Jg;qu,lk",
 W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
-Di:function(a){return a.wz.RR(0,this)},
-T7:function(a){var z,y
-z=J.NV(a.gTf(),this)
+Hs:function(a){return a.wz.RR(0,this)},
+fV:function(a){var z,y
+z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
 return y},
 CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
+z=J.okV(a.ghP(),this)
+y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
+z=J.okV(a.ghP(),this)
 if(a.gre()==null)y=null
 else{x=a.gre()
-w=this.gn8()
+w=this.gnG()
 x.toString
 y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
@@ -13921,64 +13432,64 @@
 return v},
 oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
 Zh:function(a){var z,y
-z=H.VM(new H.lJ(a.ghL(),this.gn8()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
 y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.Gzk(y))
 return y},
 o0:function(a){var z,y
-z=H.VM(new H.lJ(a.gRl(a),this.gn8()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
 YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
+z=J.okV(a.gG3(a),this)
+y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
 ex:function(a){var z,y,x
-z=J.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
 return x},
 Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
+z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(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)
+z=J.okV(a.gdc(),this)
+y=J.okV(a.gSl(),this)
+x=J.okV(a.gCW(),this)
 w=new K.an(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(w)
 y.sbO(w)
 x.sbO(w)
 return w},
 ky:function(a){var z,y,x
-z=J.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
 return x}},
 zD:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 Gzk:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
 $isEH:true},
 B8:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z=this.a
 a.sbO(z)
 return z},
@@ -14009,8 +13520,8 @@
 $isc0:true,
 $ishw:true},
 Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,82,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,145,"call"],
 $isEH:true},
 ev:{
 "^":"dE;Rl>,KL,bO,tj,Lv,k6",
@@ -14020,15 +13531,15 @@
 $isQb:true,
 $ishw:true},
 Ku:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){J.kW(a,J.Kt(b).gLv(),b.gv4().gLv())
 return a},
 $isEH:true},
 qR:{
 "^":"dE;G3>,v4<,KL,bO,tj,Lv,k6",
 RR:function(a,b){return b.YV(this)},
-$asdE:function(){return[U.nu]},
-$isnu:true,
+$asdE:function(){return[U.ae]},
+$isae:true,
 $ishw:true},
 ek:{
 "^":"dE;KL,bO,tj,Lv,k6",
@@ -14049,11 +13560,11 @@
 $iselO:true,
 $ishw:true},
 OC:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.GC(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 GC:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
@@ -14062,7 +13573,7 @@
 return z.gxS(z)},
 Qh:function(a){var z,y
 z=this.KL
-y=$.Js().t(0,z.gxS(z))
+y=$.qL().t(0,z.gxS(z))
 if(J.xC(z.gxS(z),"!")){z=this.wz.gLv()
 this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
 this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
@@ -14076,7 +13587,7 @@
 return z.gxS(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.qL().t(0,z.gxS(z))
+y=$.Jl().t(0,z.gxS(z))
 if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gLv()
 if(z==null)z=!1
 x=this.T8.gLv()
@@ -14086,27 +13597,27 @@
 else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gRT().yI(new K.P8(this,a))
 this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
 RR:function(a,b){return b.ex(this)},
-$asdE:function(){return[U.Mp]},
-$isMp:true,
+$asdE:function(){return[U.zb]},
+$iszb:true,
 $ishw:true},
 P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 an:{
-"^":"dE;dc<,Sl<,ru<,KL,bO,tj,Lv,k6",
+"^":"dE;dc<,Sl<,CW<,KL,bO,tj,Lv,k6",
 Qh:function(a){var z=this.dc.gLv()
-this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.ru.gLv()},
+this.Lv=(z==null?!1:z)===!0?this.Sl.gLv():this.CW.gLv()},
 RR:function(a,b){return b.RD(this)},
 $asdE:function(){return[U.HB]},
 $isHB:true,
 $ishw:true},
 vl:{
-"^":"dE;Tf<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,KL,bO,tj,Lv,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
 Qh:function(a){var z,y,x
-z=this.Tf.gLv()
+z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.KL
 y=y.goc(y)
@@ -14114,57 +13625,57 @@
 this.Lv=$.cp().jD(z,x)
 y=J.x(z)
 if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.T7(this)},
+RR:function(a,b){return b.fV(this)},
 $asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 WKb:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"dE;Tf<,Jn<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,Jn<,KL,bO,tj,Lv,k6",
 Qh:function(a){var z,y,x
-z=this.Tf.gLv()
+z=this.hP.gLv()
 if(z==null){this.Lv=null
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
 if(!!x.$iswn)this.tj=z.gRT().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.na(this,a,y))},
+else if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.cn(this,a,y))},
 RR:function(a,b){return b.CU(this)},
 $asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.xq(a,new K.zw(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){if(J.xq(a,new K.zw(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 zw:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return a.LT(this.d)},
 $isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.xq(a,new K.ey(this.UI))===!0)this.e.l8(this.f)},"$1",null,2,0,null,159,"call"],
+cn:{
+"^":"Tp:10;e,f,UI",
+$1:[function(a){if(J.xq(a,new K.ey(this.UI))===!0)this.e.l8(this.f)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ey:{
-"^":"Tp:13;bK",
+"^":"Tp:10;bK",
 $1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},
 $isEH:true},
 xJ:{
-"^":"dE;Tf<,re<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,re<,KL,bO,tj,Lv,k6",
 gSf:function(a){var z=this.KL
 return z.gSf(z)},
 Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
 y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
-x=this.Tf.gLv()
+x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
 if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
@@ -14172,21 +13683,21 @@
 w=$.b7().I1.t(0,z)
 this.Lv=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.K3(this,a,w))}},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}},
 RR:function(a,b){return b.ZR(this)},
 $asdE:function(){return[U.Nb]},
 $isNb:true,
 $ishw:true},
 WW:{
-"^":"Tp:13;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,46,"call"],
+"^":"Tp:10;",
+$1:[function(a){return a.gLv()},"$1",null,2,0,null,43,"call"],
 $isEH:true},
-K3:{
-"^":"Tp:172;a,b,c",
-$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,159,"call"],
+vQ:{
+"^":"Tp:159;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,146,"call"],
 $isEH:true},
 ho:{
-"^":"Tp:13;d",
+"^":"Tp:10;d",
 $1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
@@ -14195,28 +13706,28 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if(!x.$isQV&&y!=null)throw H.b(K.zq("right side of 'in' is not an iterator"))
+if(!x.$isQV&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
 if(!!x.$iswn)this.tj=y.gRT().yI(new K.OF(this,a))
 w=J.Vm(z)
 this.Lv=y==null?C.xD:J.np(x.ez(y,new K.fg(a,w)),!1)},
 RR:function(a,b){return b.ky(this)},
-$asdE:function(){return[U.X7S]},
-$isX7S:true,
+$asdE:function(){return[U.ma]},
+$isma:true,
 $ishw:true},
 OF:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,14,"call"],
+"^":"Tp:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 fg:{
-"^":"Tp:13;c,d",
+"^":"Tp:10;c,d",
 $1:[function(a){var z=this.d
-if(J.xC(z,"this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-return new K.ig(this.c,z,a)},"$1",null,2,0,null,82,"call"],
+if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+return new K.ig(this.c,z,a)},"$1",null,2,0,null,145,"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,{
+static:{xn: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
@@ -14226,7 +13737,7 @@
 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()))},
+return U.Le(H.n3(a,0,new U.VU()))},
 Zd:function(a,b){var z=J.ew(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
@@ -14238,7 +13749,7 @@
 return 536870911&a+((16383&a)<<15>>>0)},
 tu:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,173,1,46]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,160,1,43]},
 hw:{
 "^":"a;",
 $ishw:true},
@@ -14275,22 +13786,22 @@
 return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
 giO:function(a){return U.b1(this.Rl)},
 $isQb:true},
-nu:{
+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.$isnu&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
+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.Zd(U.Zd(0,z),y))},
-$isnu:true},
+$isae:true},
 XC:{
 "^":"hw;wz",
-RR:function(a,b){return b.Di(this)},
+RR:function(a,b){return b.Hs(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)},
@@ -14319,93 +13830,93 @@
 y=J.v1(this.wz)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $iscJ:true},
-Mp:{
+zb:{
 "^":"hw;xS>,Bb>,T8>",
 RR:function(a,b){return b.ex(this)},
 bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isMp&&J.xC(z.gxS(b),this.xS)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$iszb&&J.xC(z.gxS(b),this.xS)&&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.xS)
 y=J.v1(this.Bb)
 x=J.v1(this.T8)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
-$isMp:true},
+$iszb:true},
 HB:{
-"^":"hw;dc<,Sl<,ru<",
+"^":"hw;dc<,Sl<,CW<",
 RR:function(a,b){return b.RD(this)},
-bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
+bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.CW)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gCW(),this.CW)},
 giO:function(a){var z,y,x
 z=J.v1(this.dc)
 y=J.v1(this.Sl)
-x=J.v1(this.ru)
+x=J.v1(this.CW)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isHB:true},
-X7S:{
+ma:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isX7S&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
+return!!z.$isma&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
 return U.Le(U.Zd(U.Zd(0,z),y))},
-$isX7S:true},
+$isma:true},
 zX:{
-"^":"hw;Tf<,Jn<",
+"^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
+bu:function(a){return H.d(this.hP)+"["+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)},
+return!!J.x(b).$iszX&&J.xC(b.ghP(),this.hP)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.Jn)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.T7(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
+"^":"hw;hP<,oc>",
+RR:function(a,b){return b.fV(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.ghP(),this.hP)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.oc)
 return U.Le(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
 Nb:{
-"^":"hw;Tf<,Sf>,re<",
+"^":"hw;hP<,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)+")"},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
+return!!z.$isNb&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
-z=J.v1(this.Tf)
+z=J.v1(this.hP)
 y=J.v1(this.Sf)
 x=U.b1(this.re)
 return U.Le(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isNb:true},
-xs:{
-"^":"Tp:75;",
+VU:{
+"^":"Tp:69;",
 $2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
-"^":"a;rp,Sa,mV,vi",
+"^":"a;rp,AO,mV,vi",
 gQi:function(){return this.vi.lo},
-lx:function(a,b){var z
+HA:function(a,b){var z
 if(a!=null){z=this.vi.lo
 z=z==null||!J.xC(J.Iz(z),a)}else z=!1
 if(!z)if(b!=null){z=this.vi.lo
@@ -14413,10 +13924,10 @@
 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)},
+Bp:function(){return this.HA(null,null)},
+GI:function(a){return this.HA(a,null)},
 Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.ia()
+return C.x4}var z=this.Yq()
 return z==null?null:this.tF(z,0)},
 tF:function(a,b){var z,y,x,w,v,u
 for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
@@ -14425,15 +13936,15 @@
 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.ia())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
 this.Bp()
 w=this.Te()
 this.rp.toString
-a=new U.X7S(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+a=new U.ma(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
 if(typeof z!=="number")return z.F()
 if(typeof b!=="number")return H.s(b)
 z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
+if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.HA(8,"?")
 v=this.Te()
 this.GI(5)
 u=this.Te()
@@ -14444,14 +13955,14 @@
 z=J.x(b)
 if(!!z.$iselO){z=z.gP(b)
 this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$iselO){z=J.Vm(b.gTf())
+return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
 this.rp.toString
 return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
 ZJ:function(a){var z,y,x,w
 z=this.vi.lo
 this.Bp()
-y=this.ia()
+y=this.Yq()
 while(!0){x=this.vi.lo
 if(x!=null)if(J.xC(J.Iz(x),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){x=this.vi.lo.gP9()
 w=z.gP9()
@@ -14463,8 +13974,8 @@
 if(!x)break
 y=this.tF(y,this.vi.lo.gP9())}x=J.Vm(z)
 this.rp.toString
-return new U.Mp(x,a,y)},
-ia:function(){var z,y,x,w
+return new U.zb(x,a,y)},
+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()
@@ -14498,7 +14009,7 @@
 case 7:return this.Xk()
 case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
 x=this.Te()
-this.lx(9,")")
+this.HA(9,")")
 this.rp.toString
 return new U.XC(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
 else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
@@ -14511,7 +14022,7 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
 z.push(this.Te())
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
+this.HA(9,"]")
 return new U.c0(z)},
 pH:function(){var z,y,x
 z=[]
@@ -14522,10 +14033,10 @@
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
 this.Bp()
-this.lx(5,":")
-z.push(new U.nu(x,this.Te()))
+this.HA(5,":")
+z.push(new U.ae(x,this.Te()))
 y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
+this.HA(9,"}")
 return new U.Qb(z)},
 qK:function(){var z,y,x
 if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
@@ -14549,13 +14060,13 @@
 if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
 y.push(this.Te())
 z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
+this.HA(9,")")
 return y}return},
 Ew:function(){var z,y
 z=this.vi.lo
 if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
 y=this.Te()
-this.lx(9,"]")
+this.HA(9,"]")
 return y}return},
 ef:function(){var z,y
 z=J.Vm(this.vi.lo)
@@ -14578,7 +14089,7 @@
 return y},
 Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","zp",2,0,66,67],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,63,64],
 O1:{
 "^":"a;vH>,P>",
 n:function(a,b){if(b==null)return!1
@@ -14587,14 +14098,14 @@
 bu:function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},
 $isO1:true},
 Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
+"^":"mW;F5",
+gA:function(a){var z=new K.vR(J.mY(this.F5),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.tx(this.YR)},
+gB:function(a){return J.q8(this.F5)},
+gl0:function(a){return J.tx(this.F5)},
 grZ:function(a){var z,y
-z=this.YR
+z=this.F5
 y=J.U6(z)
 z=new K.O1(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14602,15 +14113,15 @@
 $asmW:function(a){return[[K.O1,a]]},
 $asQV:function(a){return[[K.O1,a]]}},
 vR:{
-"^":"Yl;qJ,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.qJ
-if(z.G()){this.CD=H.VM(new K.O1(this.wX++,z.gl()),[null])
-return!0}this.CD=null
+"^":"Yl;Tr,Mv,Ta",
+gl:function(){return this.Ta},
+G:function(){var z=this.Tr
+if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
+return!0}this.Ta=null
 return!1},
 $asYl:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-wX:function(a){switch(a){case 102:return 12
+Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
@@ -14657,7 +14168,7 @@
 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))
+x=H.Lw(Y.Ox(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))
@@ -14676,7 +14187,7 @@
 y.vM+=x
 this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.WJ,v))z.push(new Y.qS(10,v,0))
+if(C.Nm.tg(C.Cd,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
@@ -14713,50 +14224,70 @@
 "^":"",
 Jg:{
 "^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gn8",2,0,174,152]},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,161,138]},
 cfS:{
 "^":"Jg;",
 xn:function(a){},
 W9:function(a){this.xn(a)},
-Di:function(a){a.wz.RR(0,this)
+Hs:function(a){a.wz.RR(0,this)
 this.xn(a)},
-T7:function(a){J.NV(a.gTf(),this)
+fV:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
+CU:function(a){J.okV(a.ghP(),this)
+J.okV(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)
+J.okV(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 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)
+for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
 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)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
+YV:function(a){J.okV(a.gG3(a),this)
+J.okV(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)
+ex:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
+Hx:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
+RD:function(a){J.okV(a.gdc(),this)
+J.okV(a.gSl(),this)
+J.okV(a.gCW(),this)
 this.xn(a)},
-ky:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
+ky:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
+this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+"^":"",
+qZ:{
+"^":"V39;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giJ:function(a){return a.GF},
+siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
+static:{RH:function(a){var z,y,x,w
+z=$.XZ()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Vp.ZL(a)
+C.Vp.XI(a)
+return a}}},
+V39:{
+"^":"uL+Pi;",
+$isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
 ov:{
-"^":"V41;oX,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+"^":"V40;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Ny},
+sIs:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
 gBV:function(a){return a.GR},
 sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
 gMl:function(a){return a.cI},
@@ -14766,28 +14297,28 @@
 gGd:function(a){return a.Kf},
 sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 rh:[function(a,b){this.Kn(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,20,57],
-OM:[function(a,b){this.ct(a,C.SA,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,13,57],
-fT:[function(a,b){var z,y
-z=a.oX
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,54],
+fX:[function(a,b){this.Kn(a)},"$1","gIF",2,0,17,54],
+xx:[function(a,b){this.ct(a,C.SA,0,1)
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,54],
+Jf:[function(a,b){var z,y
+z=a.Ny
 if(z==null||a.FZ!==!0)return"min-width:32px;"
 y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
 if(J.xC(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,175,176],
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,162,163],
 Kn:function(a){var z,y,x,w,v
-if(J.iS(a.oX)!==!0){J.SK(a.oX).ml(new T.Wd(a))
+if(J.iS(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
 return}this.ct(a,C.SA,0,1)
 J.U2(a.Kf)
-z=a.oX.q6(a.GR)
+z=a.Ny.q6(a.GR)
 if(z!=null){y=a.cI
-x=a.oX
+x=a.Ny
 if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.Hn(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.oX),y.W(v,1)))}}},
-static:{"^":"px,MRW,VnP",Zz:function(a){var z,y,x,w,v
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),y.W(v,1)))}}},
+static:{"^":"bN,MRW,VnP",Zz:function(a){var z,y,x,w,v
 z=R.tB([])
 y=$.XZ()
 x=P.YM(null,null,null,P.qU,W.I0)
@@ -14802,13 +14333,13 @@
 C.oA.ZL(a)
 C.oA.XI(a)
 return a}}},
-V41:{
+V40:{
 "^":"uL+Pi;",
 $isd3:true},
 Wd:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0)J.vH(z)},"$1",null,2,0,null,14,"call"],
+if(J.iS(z.Ny)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
 $isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 kn:{
@@ -14818,10 +14349,10 @@
 gJp:function(a){var z=a.tY
 if(z==null)return Q.xI.prototype.gJp.call(this,a)
 return z.gzz()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
+fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,17,54],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,17,11],
 goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
@@ -14853,7 +14384,7 @@
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":"V42;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V41;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gIs:function(a){return a.Uz},
 sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
 gnN:function(a){return a.HJ},
@@ -14863,9 +14394,9 @@
 z=a.Uz
 if(z==null)return
 J.SK(z)},
-ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,13,57],
-RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,20,91],
-j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,20,91],
+ii:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,54],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,17,84],
+j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,17,84],
 static:{TXt:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -14879,45 +14410,18 @@
 C.FH.ZL(a)
 C.FH.XI(a)
 return a}}},
-V42:{
+V41:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
+hi:function(a,b){var z,y,x,w,v,u,t,s
 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.Qe(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,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
+z=J.rY(y)
+switch(z.nC(y,"@")?z.yn(y,1):y){case"Code":z=[]
 z.$builtinTypeInfo=[D.ta]
 x=[]
 x.$builtinTypeInfo=[D.ta]
@@ -14941,19 +14445,14 @@
 w.$builtinTypeInfo=[P.qU]
 v=[]
 v.$builtinTypeInfo=[D.ER]
-u=D.dy
+u=D.U4
 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,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
@@ -14965,7 +14464,7 @@
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.dy
+z=D.vO
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
@@ -15028,59 +14527,61 @@
 god:function(a){var z=this.Jz
 return z.god(z)},
 gjO:function(a){return this.r0},
-gzS:function(){return this.j7},
+gzS:function(){return this.mQ},
 gPj:function(a){return this.Jz.Mq(this.r0)},
-gox:function(a){return this.kT},
+gHP:function(){return"#/"+H.d(this.gPj(this))},
+sHP:function(a){},
+gox:function(a){return this.Sa},
 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))},
 gzz:function(){return this.gt7()},
 szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.PG(this,null)
+xW:function(a){if(this.Sa)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
 if(J.xC(this.r0,""))return P.PG(this,null)
-if(this.kT&&this.gfS())return P.PG(this,null)
+if(this.Sa&&this.gfS())return P.PG(this,null)
 z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
+if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.Jt(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.Qe(x)
+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.j7=x
+this.mQ=x
 this.bF(0,a,y)},
 $isaf:true},
 Pa:{
-"^":"Tp:178;a",
+"^":"Tp:165;a",
 $1:[function(a){var z,y
 z=J.UQ(a,"type")
-y=J.Qe(z)
+y=J.rY(z)
 if(y.nC(z,"@"))z=y.yn(z,1)
 y=this.a
-if(!J.xC(z,y.j7))return D.hi(y.Jz,a)
+if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,177,"call"],
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
-jI:{
-"^":"Tp:69;b",
+Jt:{
+"^":"Tp:66;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-xm:{
+fz:{
 "^":"af;"},
 wv:{
 "^":"O1w;",
 gwv:function(a){return this},
 god:function(a){return},
-giR:function(){var z=this.z7
+gi2:function(){var z=this.z7
 return z.gUQ(z)},
 gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,144,179],
+Mq:function(a){return H.d(a)},
 gYe:function(){return this.Ox},
 gJk:function(){return this.RW},
 gA3:function(){return this.Ts},
@@ -15095,8 +14596,8 @@
 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)
+Gn:function(a){var z,y,x
+z=$.Dw().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -15110,13 +14611,19 @@
 z=this.z7.t(0,a)
 if(z!=null)return P.PG(z,null)
 return this.VD(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.hV(a)
-return this.Tn(z).ml(new D.lb(this,y))}x=this.Qy.t(0,a)
-if(x!=null)return J.LE(x)
-return this.HL(a).ml(new D.aEE(this,a))},
-nJ:[function(a,b){return b},"$2","ge1",4,0,75],
+cv:function(a){var z,y,x,w,v
+z={}
+z.a=a
+y=J.uH(a,"#")
+if(0>=y.length)return H.e(y,0)
+a=y[0]
+z.a=a
+if(J.co(a,"isolates/")){x=this.Gn(z.a)
+w=this.hV(z.a)
+return this.Tn(x).ml(new D.lb(this,w))}v=this.Qy.t(0,z.a)
+if(v!=null)return J.LE(v)
+return this.HL(z.a).ml(new D.aEE(z,this))},
+nJ:[function(a,b){return b},"$2","ge1",4,0,69],
 ng:function(a){var z,y,x
 z=null
 try{y=new P.Cf(this.ge1())
@@ -15131,7 +14638,7 @@
 HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"version")
 this.Ox=F.Wi(this,C.zn,this.Ox,y)
@@ -15162,35 +14669,35 @@
 this.eC(R.tB(z))},
 $iswv:true},
 O1w:{
-"^":"xm+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;a,b",
 $1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,123,"call"],
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,110,"call"],
 $isEH:true},
 lb:{
-"^":"Tp:13;a,b",
+"^":"Tp:10;b,c",
 $1:[function(a){var z
-if(a==null)return this.a
-z=this.b
+if(a==null)return this.b
+z=this.c
 if(z==null)return J.LE(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
+else return a.cv(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
 aEE:{
-"^":"Tp:178;c,d",
+"^":"Tp:165;a,d",
 $1:[function(a){var z,y
-z=this.c
+z=this.d
 y=D.hi(z,a)
-if(y.gUm())z.Qy.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,177,"call"],
+if(y.gUm())z.Qy.to(this.a.a,new D.zK(y))
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
 zK:{
-"^":"Tp:69;e",
+"^":"Tp:66;e",
 $0:function(){return this.e},
 $isEH:true},
 zA:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y,x,w
 z=null
 try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
@@ -15198,39 +14705,39 @@
 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,126,"call"],
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,113,"call"],
 $isEH:true},
 tm:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 mR:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 bp:{
-"^":"Tp:13;c",
+"^":"Tp:10;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,85,"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 hc:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Hq:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){J.LE(b)},
 $isEH:true},
 ER:{
 "^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
+T1:function(a){var z,y,x,w,v
 z=this.XE
-H.Lm(z,0,a)
+H.aB(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
@@ -15258,7 +14765,7 @@
 for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
 $isER:true},
 tL:{
-"^":"a;af<,lI<,h7,yP,hD,RP",
+"^":"a;af<,Fw<,h7,yP,hD,RP",
 gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
 this.h7=a
@@ -15267,7 +14774,7 @@
 x=this.af
 if(x.length===0){C.Nm.FV(x,z.t(b,"names"))
 this.RP=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
+for(z=this.hD,x=this.Fw,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
 v.$builtinTypeInfo=[P.KN]
@@ -15278,7 +14785,7 @@
 z.fixed$length=init
 z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.eK(y)
+z.T1(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
@@ -15286,22 +14793,24 @@
 u=new D.ER(a,H.VM(z,[P.KN]),0)
 u.y8(y,this.yP.XE)
 this.yP.Vy(0,y)
-z=this.lI
+z=this.Fw
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
+if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,h0,AI,v9,tW,zb,px:KT@,t7:PB@,Er,SF,Dr,lP,W1,yz,Hw,vJ,mk,BC<,I5,bj,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,tW,zb,px:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,mk,BC<,FF,bj,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gwv:function(a){return this.Jz},
 god:function(a){return this},
 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)},
+gPj:function(a){return this.r0},
+gHP:function(){return"#/"+H.d(this.r0)},
 gBP:function(a){return this.Jr},
 gA6:function(){return this.EY},
 gaj:function(){return this.eU},
 gn0:function(){return this.zG},
-gOj:function(){return this.XV},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,144,179],
+gwg:function(){return this.XV},
+Mq:function(a){return H.d(this.r0)+"/"+H.d(a)},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,166,167],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
@@ -15317,25 +14826,9 @@
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").EX(w,b,x)}},
-lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,180],
-cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,181,182],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gxY())},
-dG:[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.hz(z,!1)},"$1","geL",2,0,183,184],
-OV:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.h0=F.Wi(this,C.as,this.h0,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gzz(),"Object")&&J.xC(x.gi2(),!1)){w=this.h0
-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.h0=x}}return P.PG(this.h0,null)},"$1","gxY",2,0,185,186],
+J.UQ(w,"code").eL(w,b,x)}},
+lh:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gWp",0,0,168],
+cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,169,170],
 Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
@@ -15347,8 +14840,7 @@
 return x},
 cv:function(a){var z=this.Qy.t(0,a)
 if(z!=null)return J.LE(z)
-return this.Jz.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.h0},
+return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
 gVc:function(){return this.v9},
 sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
 gvU:function(){return this.tW},
@@ -15358,11 +14850,11 @@
 gzz:function(){return this.PB},
 szz:function(a){this.PB=F.Wi(this,C.Tc,this.PB,a)},
 geH:function(){return this.Er},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
 gCi:function(){return this.lP},
 guq:function(){return this.W1},
-gxs:function(){return this.yz},
+gxs:function(){return this.p2},
 gQB:function(){return this.Hw},
 gkc:function(a){return this.mk},
 skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
@@ -15375,14 +14867,14 @@
 y=z.t(b,"name")
 this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 this.zG=F.Wi(this,C.DY,this.zG,!1)
 D.tg(b,this)
 if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
 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.cL=F.Wi(this,C.tP,this.cL,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)
@@ -15423,7 +14915,7 @@
 y=J.UQ(z.t(b,"heap"),"usedOld")
 this.W1=F.Wi(this,C.ap,this.W1,y)
 y=J.UQ(z.t(b,"heap"),"capacityNew")
-this.yz=F.Wi(this,C.So,this.yz,y)
+this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
 this.Hw=F.Wi(this,C.eH,this.Hw,y)
 p=z.t(b,"features")
@@ -15443,32 +14935,32 @@
 y.V1(y)
 for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
 y.XP(y,new D.hU())},
-m7:function(){return this.Jz.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-uY:function(a,b){this.I5=0
+m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+uY: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.I5
+y=this.FF
 if(typeof y!=="number")return y.g()
-this.I5=y+1
+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.I5
+z=this.FF
 if(typeof z!=="number")return z.g()
-this.I5=z+1
+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.I5
+t=this.FF
 if(typeof t!=="number")return t.g()
-this.I5=t+1
+this.FF=t+1
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
@@ -15481,10 +14973,10 @@
 $isbv:true,
 static:{"^":"ZW"}},
 uz4:{
-"^":"xm+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 Mn:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
@@ -15495,47 +14987,47 @@
 a.Oo.V1(0)}},
 $isEH:true},
 Yb:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,187,"call"],
+z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,171,"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:178;a,b",
+"^":"Tp:165;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=D.hi(z,a)
 if(y.gUm())z.Qy.to(this.b,new D.Ng(y))
-return y},"$1",null,2,0,null,177,"call"],
+return y},"$1",null,2,0,null,164,"call"],
 $isEH:true},
 Ng:{
-"^":"Tp:69;c",
+"^":"Tp:66;c",
 $0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,188,"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,172,"call"],
 $isEH:true},
 hU:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
 $isEH:true},
 AP:{
-"^":"Tp:178;a",
+"^":"Tp:165;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,138,"call"],
+return y},"$1",null,2,0,null,127,"call"],
 $isEH:true},
 vO:{
-"^":"af;Ce,Jz,r0,j7,kT,px,t7,VR,AP,fn",
-gUm:function(){return(J.xC(this.j7,"Class")||J.xC(this.j7,"Function")||J.xC(this.j7,"Field"))&&!J.co(this.r0,$.RQ)},
+"^":"af;Ce,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
 gfS:function(){return!1},
 bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
-this.kT=!c
+this.Sa=!c
 z=this.Ce
 z.V1(0)
 z.FV(0,b)
@@ -15561,13 +15053,13 @@
 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,109],
+return z.HC(z)},"$0","gDx",0,0,96],
 nq:function(a,b){var z=this.Ce
 return z.nq(z,b)},
 ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
-k0:[function(a){return},"$0","gcm",0,0,18],
+k0:[function(a){return},"$0","gcm",0,0,15],
 NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
+return},"$0","gym",0,0,15],
 gqh:function(a){var z=this.Ce
 return z.gqh(z)},
 gnz:function(a){var z,y
@@ -15583,7 +15075,7 @@
 $isd3:true,
 static:{"^":"RQ"}},
 ft:{
-"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"D3;I0,LD,jo,ZG,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
@@ -15608,12 +15100,12 @@
 "^":"af+Pi;",
 $isd3:true},
 N7:{
-"^":"wVq;I0,LD,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"wVq;I0,LD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
-this.kT=!0
+this.Sa=!0
 z=J.U6(b)
 y=z.t(b,"kind")
 this.I0=F.Wi(this,C.Lc,this.I0,y)
@@ -15628,11 +15120,12 @@
 "^":"af+Pi;",
 $isd3:true},
 EP:{
-"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"dZL;I0,LD,IV,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 gG1:function(a){return this.LD},
 gbA:function(a){return this.IV},
+sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
@@ -15650,7 +15143,7 @@
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gO3:function(a){return this.dj},
 gUm:function(){return!0},
 gfS:function(){return!1},
@@ -15670,7 +15163,7 @@
 y=z.t(b,"name")
 this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=this.Bm
@@ -15692,76 +15185,11 @@
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,mk,ks>,S5<,tJ<,mu<,p2<,AP,fn,Jz,r0,j7,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.mk},
-skc:function(a,b){this.mk=F.Wi(this,C.yh,this.mk,b)},
-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
-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.Jz
-D.tg(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)
-z=z.t(b,"error")
-this.mk=F.Wi(this,C.yh,this.mk,z)},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
 c2:{
 "^":"a;Rd<,a4>",
 $isc2:true},
 vx:{
-"^":"Zqa;Gd>,u9<,I0,l9,nE,mB,A1,y6,FB,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"V4b;Gd>,u9<,I0,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 ghY:function(){return this.l9},
@@ -15769,11 +15197,11 @@
 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.l9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
+gSK:function(){return this.lx},
+sSK:function(a){var z=this.lx
 if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
+this.nq(this,z)}this.lx=a},
 gUm:function(){return!0},
 gfS:function(){return!0},
 rK:function(a){var z,y
@@ -15796,14 +15224,14 @@
 this.px=this.ct(this,C.YS,this.px,w)
 w=this.A1
 this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
+this.ip(z.t(b,"source"))
 this.PT(z.t(b,"tokenPosTable"))},
 PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
 this.y6=P.Fl(null,null)
 this.FB=P.Fl(null,null)
 this.l9=F.Wi(this,C.Gd,this.l9,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
+this.lx=F.Wi(this,C.kA,this.lx,null)
 for(z=J.mY(a);z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,0)
@@ -15817,22 +15245,22 @@
 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.l9=t
-u=this.nE
+u=this.lx
 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.l9:t
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.l9:t
 r=this.l9
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
 r.$builtinTypeInfo=[null]
 this.nq(this,r)}this.l9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
+u=J.J5(this.lx,t)?this.lx:t
+r=this.lx
 if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
+this.nq(this,r)}this.lx=u}this.y6.u(0,t,w)
 this.FB.u(0,t,s)
 v+=2}}},
-vW:function(a){var z,y,x,w
+SC:function(a){var z,y,x,w
 z=J.U6(a)
 y=this.u9
 x=0
@@ -15841,26 +15269,26 @@
 if(!(x<w))break
 y.u(0,z.t(a,x),z.t(a,x+1))
 x+=2}},
-W8:function(a){var z,y,x,w
-this.kT=!1
+ip:function(a){var z,y,x,w
+this.Sa=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
-this.kT=!0
+this.Sa=!0
 y=this.Gd
 y.V1(y)
 N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
 for(x=0;x<z.length;x=w){w=x+1
 y.h(0,new D.c2(w,z[x]))}},
 $isvx:true},
-Zqa:{
+V4b:{
 "^":"af+Pi;",
 $isd3:true},
 uA:{
 "^":"a;Yu<,Du<,fF<",
 $isuA:true},
 HJ:{
-"^":"Pi;Yu<,Ix,VF<,KO,fY>,ar,MT,AP,fn",
+"^":"Pi;Yu<,Ix,VF<,YnP,fY>,ar,MT,AP,fn",
 gIs:function(a){return this.ar},
 sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
 gP3:function(){return this.MT},
@@ -15868,7 +15296,7 @@
 z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,189],
+return y.bu(z)},"$0","gkA",0,0,173],
 bR:function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
@@ -15888,18 +15316,18 @@
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,189],
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,173],
 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,190,71],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,174,68],
 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,190,71],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,174,68],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15930,7 +15358,7 @@
 static:{"^":"Oci,pg,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
-else if(z.n(a,"Collected"))return C.WA
+else if(z.n(a,"Collected"))return C.wV
 else if(z.n(a,"Reused"))return C.yP
 else if(z.n(a,"Tag"))return C.Z7
 N.QM("").j2("Unknown code kind "+H.d(a))
@@ -15942,7 +15370,7 @@
 "^":"a;tT>,Av<,ks>,Jv",
 $ist9:true},
 kx:{
-"^":"D3i;I0,xM,Du<,fF<,ub,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"Zqa;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gfY:function(a){return this.I0},
 sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
 glt:function(){return this.xM},
@@ -15959,7 +15387,7 @@
 gfS:function(){return!0},
 tx:[function(a){var z,y
 this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,191,192],
+for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","guL",2,0,175,176],
 OF:function(){if(this.ar!=null)return
 if(!J.xC(this.I0,C.l8))return
 var z=this.MO
@@ -15979,7 +15407,7 @@
 if(w>>>0!==w||w>=c.length)return H.e(c,w)
 a.push(new D.ta(c[w],v))
 y+=2}H.rd(a,new D.fx())},
-EX:function(a,b,c){var z,y
+eL:function(a,b,c){var z,y
 this.xM=F.Wi(this,C.Kj,this.xM,c)
 z=J.U6(a)
 this.fF=H.BU(z.t(a,"inclusive_ticks"),null,null)
@@ -16000,7 +15428,7 @@
 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.ub=H.BU(z.t(b,"start"),16,null)
+this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
 y=this.Jz
 x=y.god(y).Qn(z.t(b,"function"))
@@ -16012,7 +15440,7 @@
 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)
+this.Sa=z.length!==0||!J.xC(this.I0,C.l8)
 z=z.length!==0&&J.xC(this.I0,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
 gUa:function(){return this.TD},
@@ -16056,24 +15484,24 @@
 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.ub)
+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:{
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.guL())},"$1",null,2,0,null,193,"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,177,"call"],
 $isEH:true},
 fx:{
-"^":"Tp:75;",
+"^":"Tp:69;",
 $2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
 l8R:{
@@ -16087,7 +15515,7 @@
 N.QM("").j2("Unknown socket kind "+H.d(a))
 throw H.b(P.a9())}}},
 WP:{
-"^":"Pqb;V8@,je,mU,I0,vud,DB,XK,FH,L7,Wu,tO,p8,FF,Wm,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"D3i;V8@,je,mU,I0,vud,DB,XK,vO,L7,zw,tO,HO,kJ,EC,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 gUm:function(){return!0},
 gHY:function(){return J.xC(this.I0,C.FJ)},
 gfY:function(a){return this.I0},
@@ -16095,13 +15523,13 @@
 gyv:function(a){return this.vud},
 gm8:function(){return this.DB},
 gaU:function(){return this.XK},
-gaP:function(){return this.FH},
+gaP:function(){return this.vO},
 gzM:function(){return this.L7},
-gkE:function(){return this.Wu},
+gkE:function(){return this.zw},
 giP:function(){return this.tO},
-gLw:function(){return this.p8},
-gNS:function(){return this.FF},
-guh:function(){return this.Wm},
+gLw:function(){return this.HO},
+gNS:function(){return this.kJ},
+guh:function(){return this.EC},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"name")
@@ -16111,7 +15539,7 @@
 y=D.Fs(z.t(b,"kind"))
 this.I0=F.Wi(this,C.Lc,this.I0,y)
 if(c)return
-this.kT=!0
+this.Sa=!0
 y=this.Jz
 D.tg(b,y.god(y))
 y=z.t(b,"readClosed")
@@ -16119,7 +15547,7 @@
 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)
+this.vO=F.Wi(this,C.To,this.vO,y)
 y=z.t(b,"listening")
 this.L7=F.Wi(this,C.cc,this.L7,y)
 y=z.t(b,"protocol")
@@ -16127,19 +15555,19 @@
 y=z.t(b,"localAddress")
 this.tO=F.Wi(this,C.Lx,this.tO,y)
 y=z.t(b,"localPort")
-this.p8=F.Wi(this,C.M3,this.p8,y)
+this.HO=F.Wi(this,C.M3,this.HO,y)
 y=z.t(b,"remoteAddress")
-this.FF=F.Wi(this,C.yL,this.FF,y)
+this.kJ=F.Wi(this,C.yL,this.kJ,y)
 y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
+this.EC=F.Wi(this,C.ni,this.EC,y)
 y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
+this.zw=F.Wi(this,C.R3,this.zw,y)
 this.V8=z.t(b,"owner")}},
-Pqb:{
+D3i:{
 "^":"af+Pi;",
 $isd3:true},
 Qf:{
-"^":"Tp:75;a,b",
+"^":"Tp:69;a,b",
 $2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
@@ -16149,9 +15577,9 @@
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
 zM:{
-"^":"V43;S4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
+"^":"V42;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.xT},
+skc:function(a,b){a.xT=this.ct(a,C.yh,a.xT,b)},
 static:{cE:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16164,12 +15592,12 @@
 C.SX.ZL(a)
 C.SX.XI(a)
 return a}}},
-V43:{
+V42:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
 Rk:{
-"^":"V44;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V43;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gja:function(a){return a.Xc},
 sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
 static:{dP:function(a){var z,y,x,w
@@ -16184,33 +15612,73 @@
 C.ZJ.ZL(a)
 C.ZJ.XI(a)
 return a}}},
-V44:{
+V43:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.RY(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())},
-SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:195;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,194,"call"],
+KM:{
+"^":"wv;S3,yb,xV,DA,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
+H4:[function(a){var z,y,x,w,v
+z=C.xr.kV(J.Qd(a))
+y=J.U6(z)
+x=y.t(z,"seq")
+w=y.t(z,"response")
+v=this.S3.Rz(0,x)
+if(v==null)N.QM("").YX("Received unexpected message: "+H.d(z))
+else J.KD(v,w)},"$1","gqF",2,0,178,78],
+z6:function(a,b){var z=this.DA
+if(z==null)return P.PG(C.xr.KP(P.EF(["type","ServiceException","id","","response","","kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null)),null)
+return z.ml(new U.N5(this,b))},
+ru:function(){var z,y,x
+this.xV="ws://"+H.d(window.location.host)+"/ws"
+z=W.lf
+y=H.VM(new P.Zf(P.Dt(z)),[z])
+this.DA=y.MM
+x=W.pS(this.xV,null)
+z=H.VM(new W.RO(x,C.Mp.Ph,!1),[null])
+z.geK(z).ml(new U.Lu(this,y,x))
+z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
+z.geK(z).ml(new U.VO(this))},
+static:{bU:function(){var z=new U.KM(P.L5(null,null,null,P.KN,P.oh),0,null,null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+z.md()
+z.ru()
+return z}}},
+Lu:{
+"^":"Tp:10;a,b,c",
+$1:[function(a){var z,y,x
+z=this.c
+y=H.VM(new W.RO(z,C.ph.Ph,!1),[null])
+x=this.a
+H.VM(new W.fd(0,y.bi,y.Ph,W.aF(x.gqF()),y.Sg),[H.Kp(y,0)]).Zz()
+y=H.VM(new W.RO(z,C.d6.Ph,!1),[null])
+y.geK(y).ml(new U.jI(x))
+y=this.b.MM
+if(y.Gv!==0)H.vh(P.w("Future already completed"))
+y.OH(z)},"$1",null,2,0,null,11,"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"],
+jI:{
+"^":"Tp:10;d",
+$1:[function(a){this.d.DA=null},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+VO:{
+"^":"Tp:10;e",
+$1:[function(a){this.e.DA=null},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+N5:{
+"^":"Tp:10;a,b",
+$1:[function(a){var z,y,x,w,v
+z=this.a
+y=z.yb++
+x=this.b
+if(!J.RY(x,"/profile/tag"))N.QM("").To("Fetching "+H.d(x)+" from "+H.d(z.xV))
+w=P.qU
+v=H.VM(new P.Zf(P.Dt(w)),[w])
+z.S3.u(0,y,v)
+J.m9(a,C.xr.KP(P.EF(["seq",y,"request",x],null,null)))
+return v.MM},"$1",null,2,0,null,179,"call"],
 $isEH:true},
 bl:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,j7,kT,px,t7,VR,AP,fn",
+"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,Sa,px,t7,VR,AP,fn",
 q3:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -16220,7 +15688,7 @@
 z=this.S3
 v=z.t(0,y)
 z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
+J.KD(v,w)},"$1","gVx",2,0,17,180],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -16236,7 +15704,7 @@
 N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 Ti:{
-"^":"V45;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V44;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gWA:function(a){return a.Ll},
 sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
 Xq:function(a){var z
@@ -16250,7 +15718,7 @@
 J.o0(z,a.Ll)
 return z
 case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
+J.fH(z,a.Ll)
 return z
 case"Error":z=W.r3("error-view",null)
 J.Qr(z,a.Ll)
@@ -16325,7 +15793,7 @@
 J.yO(z,a.Ll)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.rY(z,a.Ll)
+J.tQ(z,a.Ll)
 return z
 default:z=W.r3("json-view",null)
 J.wD(z,a.Ll)
@@ -16338,8 +15806,7 @@
 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,
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,54],
 static:{lv:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16352,7 +15819,7 @@
 C.Ns.ZL(a)
 C.Ns.XI(a)
 return a}}},
-V45:{
+V44:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
@@ -16365,12 +15832,10 @@
 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],
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,54],
 gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
+return z.gHP()},
 gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
 return z.gzz()},
@@ -16403,8 +15868,8 @@
 sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
 gRY:function(a){return a.bP},
 sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
-XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.bk,a.kF,z)},"$3","gQU",6,0,100,1,196,95],
+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,88,1,181,90],
 static:{Al:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -16418,15 +15883,15 @@
 C.Yo.XI(a)
 return a}}},
 KAf:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
 Wq:{
-"^":"a;c1,BH,Mg,QR,ER,Ja,MR,tu",
+"^":"a;wq,BH,Mg,QR,ER,Ja,MR,tu",
 WO:function(a,b){return this.tu.$1(b)},
 bu:function(a){var z=P.p9("")
 z.KF("(options:")
-z.KF(this.c1?"fields ":"")
+z.KF(this.wq?"fields ":"")
 z.KF(this.BH?"properties ":"")
 z.KF(this.Ja?"methods ":"")
 z.KF(this.Mg?"inherited ":"_")
@@ -16437,7 +15902,7 @@
 return z.vM}},
 ES:{
 "^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gHO:function(){return this.fY===C.nU},
+gZI:function(){return this.fY===C.nU},
 gUd:function(){return this.fY===C.BM},
 gUA:function(){return this.fY===C.it},
 giO:function(a){var z=this.oc
@@ -16481,24 +15946,24 @@
 if(u)return!0}}return!1},
 OS:function(a){var z,y
 z=H.G3()
-y=H.fH(z).BD(a)
+y=H.KT(z).BD(a)
 if(y)return 0
-y=H.fH(z,[z]).BD(a)
+y=H.KT(z,[z]).BD(a)
 if(y)return 1
-y=H.fH(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).BD(a)
 if(y)return 2
-z=H.fH(z,[z,z,z]).BD(a)
+z=H.KT(z,[z,z,z]).BD(a)
 if(z)return 3
 return 4},
 Zpg:function(a){var z,y
 z=H.G3()
-y=H.fH(z,[z,z,z]).BD(a)
+y=H.KT(z,[z,z,z]).BD(a)
 if(y)return 3
-y=H.fH(z,[z,z]).BD(a)
+y=H.KT(z,[z,z]).BD(a)
 if(y)return 2
-y=H.fH(z,[z]).BD(a)
+y=H.KT(z,[z]).BD(a)
 if(y)return 1
-z=H.fH(z).BD(a)
+z=H.KT(z).BD(a)
 if(z)return 0
 return-1},
 W4:function(a,b,c){var z,y,x,w,v
@@ -16514,7 +15979,7 @@
 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;LH,QD,lk,BJ,fu,af<,yQ"},
+"^":"a;LH,QD,lk,of,fu,af<,yQ"},
 LT:{
 "^":"a;eA,vk,X9",
 jD:function(a,b){var z=this.eA.t(0,b)
@@ -16561,7 +16026,7 @@
 if(y==null){if(this.ad)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.WF.t(0,b)
 if(x==null){if(!this.ad)return z
 throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gHO())continue
+if(!c.wq&&v.gZI())continue
 if(!c.BH&&v.gUd())continue
 if(c.ER&&J.ql(v)===!0)continue
 if(!c.Ja&&v.gUA())continue
@@ -16582,7 +16047,7 @@
 z.Ut(a)
 return z}}},
 Fi:{
-"^":"Tp:75;a",
+"^":"Tp:69;a",
 $2:function(a,b){this.a.I1.u(0,b,a)},
 $isEH:true},
 tk:{
@@ -16591,7 +16056,7 @@
 static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":"V46;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V45;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gM6:function(a){return a.xP},
 sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
 static:{qa:function(a){var z,y,x,w
@@ -16606,16 +16071,16 @@
 C.dX.ZL(a)
 C.dX.XI(a)
 return a}}},
-V46:{
+V45:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 uw:{
-"^":"V47;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V46;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gtN:function(a){return a.ju},
 stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,20,91],
-static:{HI:function(a){var z,y,x,w
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,17,84],
+static:{lt:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -16627,7 +16092,7 @@
 C.wB.ZL(a)
 C.wB.XI(a)
 return a}}},
-V47:{
+V46:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
@@ -16640,10 +16105,10 @@
 z.MW.setAttribute(b,y)}},
 iX:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
+if(z==null)z=new M.XI([],null,null)
 for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
 if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
+if(w==null){w=Array(y.gUN(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},
@@ -16659,7 +16124,7 @@
 else{y=$.rf()
 y.toString
 x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
+w=x==null?null:H.of(x,y.Qz())
 if(w==null)break
 a=w}}y=J.x(a)
 if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
@@ -16672,8 +16137,8 @@
 pN:function(a,b){var z,y
 z=J.x(a)
 if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$isHF){y=S.iw(a.textContent,M.H4("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
+if(!!z.$isUn){y=S.iw(a.textContent,M.H4("text",a,b))
+if(y!=null)return new M.XI(["text",y],null,null)}return},
 rJ:function(a,b,c){var z=a.getAttribute(b)
 if(z==="")z="{{}}"
 return S.iw(z,M.H4(b,a,c))},
@@ -16681,7 +16146,7 @@
 z={}
 z.a=null
 y=M.RI(a)
-new W.E9(a).aN(0,new M.Jy(z,a,b,y))
+new W.E9(a).aN(0,new M.NW(z,a,b,y))
 if(y){x=z.a
 if(x==null){w=[]
 z.a=w
@@ -16695,7 +16160,7 @@
 v.wA=u
 if(z!=null&&x==null&&u==null)v.DK=S.iw("{{}}",M.H4("bind",a,b))
 return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
+return z==null?null:new M.XI(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)
@@ -16723,8 +16188,8 @@
 $.ps=w+1
 y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gcK(),null,null,null)}x=$.ps
 $.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.PV=[]
+y=new L.NV(null,[],x,null,null,null)
+y.Wf=[]
 x=J.U6(b)
 v=0
 while(!0){w=x.gB(b)
@@ -16734,9 +16199,9 @@
 z=b.HH(v)
 if(z!=null){t=z.$3(d,c,u)
 if(u===!0)y.ti(t)
-else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gQ8())
-w=y.Bg
+else{if(y.GX!=null||y.TV==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gjM())
+w=y.TV
 w.push(C.dV)
 w.push(t)}break c$0}s=b.Pn(v)
 if(u===!0)y.ti(s.Tl(d))
@@ -16758,7 +16223,7 @@
 z=$.cm()
 z.toString
 y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
+x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isJK)x=new M.ee(a,null,null)
@@ -16767,7 +16232,7 @@
 else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isHF?new M.XT(a,null,null):new M.vy(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
 return x},
 RI:function(a){var z=J.x(a)
@@ -16808,14 +16273,14 @@
 t=null}}else{u=null
 t=null}y.sP(z,a==null?"":H.d(a))
 if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
-J.Fc(t.gvt(),y)}},"$1","ge2",2,0,20,58]},
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,55]},
 WF:{
-"^":"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"],
+"^":"Tp:10;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,62,"call"],
 $isEH:true},
 b2:{
 "^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,20,58],
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,55],
 Uh:[function(a){var z,y,x,w,v
 switch(this.jS){case"value":z=J.Vm(this.rF)
 J.Fc(this.vt,z)
@@ -16829,7 +16294,7 @@
 if(v!=null)J.Fc(v,!1)}break
 case"selectedIndex":z=J.Lr(this.rF)
 J.Fc(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
+break}O.wR()},"$1","gCL",2,0,17,1],
 TR:function(a,b){return J.mu(this.vt,b)},
 gP:function(a){return J.Vm(this.vt)},
 sP:function(a,b){J.Fc(this.vt,b)
@@ -16860,7 +16325,7 @@
 return x.ev(x,new M.qx(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
 return typeof a==="number"&&Math.floor(a)===a?a:0}}},
 YJG:{
-"^":"Tp:69;",
+"^":"Tp:66;",
 $0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
@@ -16874,18 +16339,18 @@
 v=document.createEvent("MouseEvent")
 J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gtH(x)},
+return x.length===1?C.U3:C.Nm.geK(x)},
 $isEH:true},
 pp:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:[function(a){this.a.push(C.nI)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 ik:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 iA:{
-"^":"Tp:13;a",
+"^":"Tp:10;a",
 $1:function(a){var z,y
 z=this.a
 y=J.x(a)
@@ -16897,12 +16362,12 @@
 return z},
 $isEH:true},
 qx:{
-"^":"Tp:13;b",
+"^":"Tp:10;b",
 $1:function(a){var z=J.x(a)
 return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
 LG:{
-"^":"Tp:13;",
+"^":"Tp:10;",
 $1:function(a){return 0},
 $isEH:true},
 ee:{
@@ -16922,7 +16387,7 @@
 M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}},
-PW:{
+XI:{
 "^":"a;Cd>,ks>,jb>",
 ghK:function(){return!1},
 QE:function(a){var z=this.ks
@@ -16930,7 +16395,7 @@
 if(a>=z.length)return H.e(z,a)
 return z[a]}},
 qf:{
-"^":"PW;qd,DK,wA,Cd,ks,jb",
+"^":"XI;qd,DK,wA,Cd,ks,jb",
 ghK:function(){return!0},
 $isqf:true},
 vy:{
@@ -16953,7 +16418,7 @@
 this.u2=z}return z},
 gPP:function(){return!!J.x(this.grF()).$isvy?this.grF():this},
 $isvy:true},
-DH:{
+bX:{
 "^":"a;ku,EA,Po"},
 ug:{
 "^":"V2;rF,u2,Vw",
@@ -16979,7 +16444,7 @@
 gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
 oq:function(a){var z,y
 z=this.os
-if(z!=null)z.xT()
+if(z!=null)z.NC()
 if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
 if(z!=null){z.S6(0)
 this.os=null
@@ -17004,7 +16469,7 @@
 z.u(0,w,v)}this.AD=v
 z=v}u=J.O2(z)
 $.rf().u(0,u,this.rF)
-t=new M.DH(a,null,null)
+t=new M.bX(a,null,null)
 for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.QE(r):null
 M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
 t.Po=u.lastChild
@@ -17066,7 +16531,7 @@
 return!0},
 GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,YO,vU",TA:function(a){var z,y,x,w
+static:{"^":"mn,EW,Qn,vU",TA:function(a){var z,y,x,w
 z=J.Do(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
@@ -17091,27 +16556,27 @@
 if(c){J.y2(z,b)
 return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
 z=new M.CE()
-y=J.MK(a,$.Ze())
+y=J.MK(a,$.i8())
 if(M.RI(a))z.$1(a)
 y.aN(y,z)},oR:function(){if($.vU===!0)return
 $.vU=!0
 var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
+J.t3(z,H.d($.i8())+" { display: none; }")
 document.head.appendChild(z)}}},
 CE:{
-"^":"Tp:20;",
+"^":"Tp:17;",
 $1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
 W6o:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,168,"call"],
+"^":"Tp:10;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,155,"call"],
 $isEH:true},
 aR:{
-"^":"Tp:13;a,b,c",
+"^":"Tp:10;a,b,c",
 $1:function(a){return this.c.pm(a,this.a,this.b)},
 $isEH:true},
-Jy:{
-"^":"Tp:75;a,b,c,d",
+NW:{
+"^":"Tp:69;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")
@@ -17131,7 +16596,7 @@
 RV:function(a){return this.eY.$1(a)},
 TR:function(a,b){return H.vh(P.w("binding already opened"))},
 gP:function(a){return this.bn},
-xT:function(){var z,y
+NC:function(){var z,y
 z=this.WI
 y=J.x(z)
 if(!!y.$isAp){y.S6(z)
@@ -17140,7 +16605,7 @@
 if(!!y.$isAp){y.S6(z)
 this.bn=null}},
 dE:function(a,b){var z,y,x
-this.xT()
+this.NC()
 z=this.YS.rF
 y=a.qd
 x=y!=null
@@ -17164,7 +16629,7 @@
 z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
 return}}y=this.bn
 if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,20,14],
+y=y.gP(y)}this.Io(this.Ee!==!0?[y]:y)},"$1","goo",2,0,17,11],
 Io:function(a){var z,y
 z=J.x(a)
 if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
@@ -17176,7 +16641,7 @@
 this.VC=a.gRT().yI(this.gk8())}y=this.lS
 y=y!=null?y:[]
 this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
-BK:function(a){var z,y,x,w
+Ih:function(a){var z,y,x,w
 z=J.x(a)
 if(z.n(a,-1))return this.YS.rF
 y=this.SU
@@ -17188,10 +16653,10 @@
 if(z)return x
 w=M.Ky(x).gos()
 if(w==null)return x
-return w.BK(C.jn.cU(w.SU.length,2)-1)},
+return w.Ih(C.jn.cU(w.SU.length,2)-1)},
 uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.BK(z.W(a,1))
+y=this.Ih(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
 else w=c!=null&&J.yx(c)?J.MQ(c):null
@@ -17206,8 +16671,8 @@
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.BK(y.W(a,1))
-w=this.BK(a)
+x=this.Ih(y.W(a,1))
+w=this.Ih(a)
 v=this.SU
 u=J.ew(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
@@ -17241,8 +16706,8 @@
 x=null
 h=p.Rz(0,y)
 w=null
-if(h!=null&&J.yx(J.fz(h))){w=h.gWf()
-g=J.fz(h)}else{try{w=[]
+if(h!=null&&J.yx(J.Bq(h))){w=h.gpp()
+g=J.Bq(h)}else{try{w=[]
 if(this.eY!=null)y=this.RV(y)
 if(y!=null)x=t.dI(y,z,w)}catch(f){k=H.Ru(f)
 v=k
@@ -17253,7 +16718,7 @@
 j=v
 if(j==null)H.vh(P.u("Error must not be null"))
 if(k.Gv!==0)H.vh(P.w("Future already completed"))
-k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,197,198],
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gpp())},"$1","gk8",2,0,182,183],
 Ep:function(a){var z
 for(z=J.mY(a);z.G();)J.x0(z.gl())},
 Ke:function(){var z=this.VC
@@ -17265,11 +16730,11 @@
 this.Ke()
 for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-this.xT()
+this.NC()
 this.YS.os=null
 this.Jh=!0}},
 wS:{
-"^":"a;yT>,Wf<",
+"^":"a;UN>,pp<",
 $iswS:true},
 XT:{
 "^":"vy;rF,u2,Vw",
@@ -17278,12 +16743,12 @@
 if(d){z=c==null?"":H.d(c)
 J.t3(this.rF,z)
 return}this.Mh(0,b)
-z=this.gMm()
+z=this.gmt()
 z.$1(J.mu(c,z))
 this.gCd(this).u(0,b,c)
 return c},
 ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gMm",2,0,13,21]},
+J.t3(this.rF,z)},"$1","gmt",2,0,10,18]},
 VT:{
 "^":"V2;rF,u2,Vw",
 grF:function(){return this.rF},
@@ -17340,7 +16805,7 @@
 x=z.length
 w=C.jn.cU(x,4)*4
 if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","gzf",2,0,199,21],
+return y+H.d(z[w])},"$1","gzf",2,0,184,18],
 cH:[function(a){var z,y,x,w,v,u,t,s
 z=this.jU
 if(0>=z.length)return H.e(z,0)
@@ -17351,7 +16816,7 @@
 t=v*4
 if(t>=z.length)return H.e(z,t)
 s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,200,201],
+y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gB5",2,0,185,186],
 l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
 static:{"^":"rz5,jO,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 if(a==null||a.length===0)return
@@ -17382,7 +16847,7 @@
 "^":"",
 I5:{
 "^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
-static:{vC:function(a){var z,y,x,w
+static:{cF:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
 x=P.qU
@@ -17397,12 +16862,12 @@
 return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
 el:{
-"^":"V48;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+"^":"V47;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
 gwv:function(a){return a.uB},
 swv:function(a,b){a.uB=this.ct(a,C.RJ,a.uB,b)},
 gkc:function(a){return a.lc},
 skc:function(a,b){a.lc=this.ct(a,C.yh,a.lc,b)},
-RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,20,91],
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,17,84],
 static:{oH:function(a){var z,y,x,w
 z=$.XZ()
 y=P.YM(null,null,null,P.qU,W.I0)
@@ -17415,7 +16880,7 @@
 C.bV.ZL(a)
 C.bV.XI(a)
 return a}}},
-V48:{
+V47:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
@@ -17432,7 +16897,7 @@
 W.KV.$isa=true
 W.my.$isa=true
 W.yg.$isa=true
-W.M5.$isa=true
+W.QI.$isa=true
 P.qU.$isqU=true
 P.qU.$isRz=true
 P.qU.$asRz=[P.qU]
@@ -17447,10 +16912,10 @@
 P.a6.$isRz=true
 P.a6.$asRz=[P.a6]
 P.a6.$isa=true
+P.qv.$isa=true
 P.WO.$isWO=true
 P.WO.$isQV=true
 P.WO.$isa=true
-P.oz.$isa=true
 W.h4.$ish4=true
 W.h4.$isKV=true
 W.h4.$isa=true
@@ -17465,12 +16930,12 @@
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.X7S.$ishw=true
-U.X7S.$isa=true
+U.ma.$ishw=true
+U.ma.$isa=true
 U.HB.$ishw=true
 U.HB.$isa=true
-U.Mp.$ishw=true
-U.Mp.$isa=true
+U.zb.$ishw=true
+U.zb.$isa=true
 U.x9.$ishw=true
 U.x9.$isa=true
 U.no.$ishw=true
@@ -17481,12 +16946,12 @@
 U.elO.$isa=true
 U.c0.$ishw=true
 U.c0.$isa=true
-U.nu.$ishw=true
-U.nu.$isa=true
+U.ae.$ishw=true
+U.ae.$isa=true
 U.Qb.$ishw=true
 U.Qb.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
+P.IN.$isIN=true
+P.IN.$isa=true
 P.uq.$isa=true
 N.Rw.$isa=true
 T.yj.$isyj=true
@@ -17512,33 +16977,25 @@
 P.cb.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
+W.Oq.$isOq=true
+W.Oq.$isea=true
+W.Oq.$isa=true
 A.dM.$ish4=true
 A.dM.$isKV=true
 A.dM.$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.dg.$isdg=true
-W.dg.$isea=true
-W.dg.$isa=true
+W.lf.$isa=true
+W.AW.$isAW=true
+W.AW.$isea=true
+W.AW.$isa=true
+W.K3.$isea=true
+W.K3.$isa=true
 D.ta.$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
@@ -17546,19 +17003,20 @@
 D.vx.$isvx=true
 D.vx.$isaf=true
 D.vx.$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.c2.$isc2=true
 D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kQ.$isea=true
-W.kQ.$isa=true
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
 D.t9.$isa=true
 D.HJ.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
 N.HV.$isHV=true
 N.HV.$isa=true
 H.yo.$isa=true
@@ -17610,10 +17068,10 @@
 P.iP.$isRz=true
 P.iP.$asRz=[null]
 P.iP.$isa=true
-L.AR.$isAR=true
-L.AR.$isa=true
 O.Hz.$isHz=true
 O.Hz.$isa=true
+L.AR.$isAR=true
+L.AR.$isa=true
 D.N7.$isN7=true
 D.N7.$isaf=true
 D.N7.$isa=true
@@ -17625,10 +17083,6 @@
 if(a==null)return a
 if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
-J.Qe=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.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
@@ -17643,12 +17097,16 @@
 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.Xh.prototype
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.ht.prototype
 if(typeof a=="boolean")return J.yEe.prototype
@@ -17672,6 +17130,7 @@
 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.Bq=function(a){return J.RE(a).gUN(a)}
 J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.C3=function(a,b){return J.RE(a).sig(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
@@ -17687,24 +17146,23 @@
 J.Do=function(a){return J.RE(a).gM0(a)}
 J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Du=function(a){return J.RE(a).gxN(a)}
 J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
 J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
 J.Er=function(a,b){return J.RE(a).sfY(a,b)}
 J.Ew=function(a){return J.RE(a).gkm(a)}
 J.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.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.FW=function(a,b){return J.Qe(a).j(a,b)}
+J.FW=function(a,b){return J.rY(a).j(a,b)}
 J.Fc=function(a,b){return J.RE(a).sP(a,b)}
 J.GF=function(a,b){return J.RE(a).spM(a,b)}
 J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
 J.Gc=function(a){return J.RE(a).gnv(a)}
 J.H3=function(a,b){return J.RE(a).sZA(a,b)}
+J.HF=function(a){return J.RE(a).gD7(a)}
 J.HO=function(a){return J.RE(a).gWw(a)}
 J.Hf=function(a){return J.RE(a).gd0(a)}
 J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
@@ -17712,14 +17170,14 @@
 J.Hr=function(a){return J.RE(a).gL0(a)}
 J.I1=function(a){return J.RE(a).gSf(a)}
 J.I2=function(a){return J.RE(a).gwv(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
 J.IO=function(a){return J.RE(a).gRH(a)}
 J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Im=function(a){return J.RE(a).gSk(a)}
 J.Ip=function(a,b){return J.RE(a).QS(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
-J.JA=function(a,b,c){return J.Qe(a).h8(a,b,c)}
+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.JZ=function(a,b){return J.RE(a).st0(a,b)}
@@ -17736,7 +17194,6 @@
 J.Kn=function(a){return J.Wx(a).yu(a)}
 J.Kt=function(a){return J.RE(a).gG3(a)}
 J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.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)}
@@ -17750,7 +17207,6 @@
 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.M2=function(a,b){return J.w1(a).ev(a,b)}
 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)}
@@ -17764,11 +17220,10 @@
 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.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
-J.Nj=function(a,b,c){return J.Qe(a).Nj(a,b,c)}
+J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
 J.Nl=function(a){return J.RE(a).gO3(a)}
 J.O2=function(a){return J.RE(a).JP(a)}
 J.O6=function(a){return J.RE(a).goc(a)}
@@ -17778,7 +17233,6 @@
 J.OT=function(a){return J.RE(a).gXE(a)}
 J.Ok=function(a){return J.RE(a).ghU(a)}
 J.Oo=function(a,b){return J.RE(a).sjT(a,b)}
-J.Oq=function(a){return J.RE(a).gWc(a)}
 J.P2=function(a,b){return J.RE(a).sU4(a,b)}
 J.P5=function(a){return J.RE(a).gHo(a)}
 J.PB=function(a){return J.RE(a).gI(a)}
@@ -17805,9 +17259,11 @@
 J.RC=function(a){return J.RE(a).gTA(a)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.RY=function(a,b){return J.Qe(a).Tc(a,b)}
+J.RY=function(a,b){return J.rY(a).Tc(a,b)}
 J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
 J.Ry=function(a){return J.RE(a).gLW(a)}
+J.S2=function(a,b){return J.RE(a).jn(a,b)}
+J.S5=function(a,b){return J.RE(a).sbA(a,b)}
 J.S9=function(a){return J.RE(a).gyX(a)}
 J.SF=function(a,b){return J.RE(a).sIi(a,b)}
 J.SG=function(a){return J.RE(a).gDI(a)}
@@ -17818,9 +17274,8 @@
 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.Sq=function(a,b){return J.RE(a).Ft(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.Td=function(a){return J.RE(a).gpf(a)}
 J.Tm=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)}
@@ -17836,6 +17291,7 @@
 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,b){return J.U6(a).u8(a,b)}
 J.VJ=function(a,b){return J.w1(a).sit(a,b)}
 J.VL=function(a){return J.RE(a).gR2(a)}
 J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
@@ -17847,12 +17303,13 @@
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.Vw=function(a,b){return J.U6(a).sB(a,b)}
 J.W2=function(a){return J.RE(a).gCf(a)}
+J.WA=function(a){return J.RE(a).gMZ(a)}
 J.WB=function(a,b){return J.RE(a).skZ(a,b)}
 J.WI=function(a,b){return J.RE(a).sLF(a,b)}
 J.WM=function(a){return J.RE(a).gyv(a)}
-J.WS=function(a){return J.RE(a).gD7(a)}
 J.WT=function(a){return J.RE(a).gFR(a)}
 J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WY=function(a){return J.RE(a).gnp(a)}
 J.Wp=function(a){return J.RE(a).gQU(a)}
 J.XF=function(a,b){return J.RE(a).siC(a,b)}
 J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
@@ -17864,14 +17321,13 @@
 J.ZL=function(a){return J.RE(a).gAF(a)}
 J.ZN=function(a){return J.RE(a).gqN(a)}
 J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
-J.ZZ=function(a,b){return J.Qe(a).yn(a,b)}
+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.aw=function(a,b){return J.RE(a).sNN(a,b)}
 J.bB=function(a){return J.x(a).gbx(a)}
-J.bL=function(a){return J.RE(a).gwg(a)}
 J.ba=function(a){return J.RE(a).gKJ(a)}
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
@@ -17883,18 +17339,18 @@
 J.cU=function(a){return J.RE(a).gHh(a)}
 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.Qe(a).nC(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.dq=function(a){return J.RE(a).gJD(a)}
-J.eU=function(a){return J.RE(a).gRh(a)}
-J.et=function(a,b){return J.U6(a).kJ(a,b)}
+J.eU=function(a){return J.RE(a).gY9(a)}
 J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
 return J.Qc(a).g(a,b)}
 J.fA=function(a){return J.RE(a).gJp(a)}
 J.fD=function(a){return J.RE(a).e6(a)}
+J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
 J.fa=function(a,b){return J.RE(a).sEQ(a,b)}
 J.fb=function(a,b){return J.RE(a).sql(a,b)}
@@ -17904,7 +17360,6 @@
 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.fz=function(a){return J.RE(a).gyT(a)}
 J.hS=function(a,b){return J.w1(a).srZ(a,b)}
 J.hb=function(a){return J.RE(a).gQ1(a)}
 J.hn=function(a){return J.RE(a).gEu(a)}
@@ -17919,7 +17374,6 @@
 J.is=function(a){return J.RE(a).gZm(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
 J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
 J.jH=function(a){return J.RE(a).ghN(a)}
 J.jP=function(a){return J.RE(a).gbA(a)}
 J.jd=function(a,b){return J.RE(a).snZ(a,b)}
@@ -17944,7 +17398,6 @@
 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.m9=function(a,b){return J.RE(a).wR(a,b)}
@@ -17961,11 +17414,12 @@
 J.ns=function(a){return J.RE(a).gjT(a)}
 J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.o0=function(a,b){return J.RE(a).sRu(a,b)}
-J.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.oL=function(a){return J.RE(a).gWT(a)}
 J.oN=function(a){return J.RE(a).gj4(a)}
+J.oO=function(a,b){return J.RE(a).siJ(a,b)}
+J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.p7=function(a){return J.RE(a).guD(a)}
 J.pB=function(a){return J.RE(a).gDX(a)}
@@ -17981,15 +17435,14 @@
 J.qq=function(a,b){return J.RE(a).sNG(a,b)}
 J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
-J.rY=function(a,b){return J.RE(a).swv(a,b)}
 J.ra=function(a){return J.RE(a).gJ6(a)}
-J.rr=function(a){return J.Qe(a).bS(a)}
+J.rr=function(a){return J.rY(a).bS(a)}
 J.rw=function(a){return J.RE(a).gMl(a)}
 J.t3=function(a,b){return J.RE(a).sa4(a,b)}
 J.t8=function(a){return J.RE(a).gYQ(a)}
 J.tF=function(a){return J.RE(a).gyW(a)}
 J.tH=function(a,b){return J.RE(a).sHy(a,b)}
-J.tO=function(a){return J.w1(a).Jd(a)}
+J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tp=function(a){return J.RE(a).gHy(a)}
 J.tv=function(a,b){return J.RE(a).sDX(a,b)}
 J.tx=function(a){return J.U6(a).gl0(a)}
@@ -17997,22 +17450,23 @@
 J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
 return J.Wx(a).C(a,b)}
 J.u9=function(a){return J.RE(a).gVU(a)}
-J.uH=function(a,b){return J.Qe(a).Fr(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){return J.RE(a).gVE(a)}
 J.uW=function(a){return J.RE(a).gyG(a)}
 J.uX=function(a,b){return J.RE(a).sph(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
 J.ul=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.un=function(a){return J.RE(a).giJ(a)}
 J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
 J.vH=function(a){return J.RE(a).Kn(a)}
 J.vI=function(a,b,c){return J.RE(a).D9(a,b,c)}
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vi=function(a){return J.RE(a).gNa(a)}
+J.vo=function(a,b){return J.w1(a).ev(a,b)}
 J.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)}
@@ -18033,6 +17487,7 @@
 J.xW=function(a,b){return J.RE(a).sZm(a,b)}
 J.xa=function(a){return J.RE(a).geS(a)}
 J.xq=function(a,b){return J.w1(a).Vr(a,b)}
+J.xs=function(a,b){return J.Wx(a).O(a,b)}
 J.y2=function(a,b){return J.RE(a).mx(a,b)}
 J.y9=function(a){return J.RE(a).lh(a)}
 J.yA=function(a){return J.RE(a).gvu(a)}
@@ -18051,22 +17506,21 @@
 J.zY=function(a){return J.RE(a).gdu(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
 C.Gx=X.hV.prototype
-C.C8=B.G6.prototype
+C.J0=B.G6.prototype
 C.HR=A.wM.prototype
 C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
 C.ka=Z.aC.prototype
 C.tA=O.VY.prototype
 C.ux=F.Be.prototype
 C.T0=R.i6.prototype
 C.O0=R.JI.prototype
 C.OD=F.ZP.prototype
-C.zg=L.nJ.prototype
+C.Gh=L.nJ.prototype
 C.UF=R.Eg.prototype
 C.MC=D.i7.prototype
-C.D4=A.Gk.prototype
+C.by=A.Gk.prototype
 C.Cl=X.MJ.prototype
-C.n0=X.Nr.prototype
+C.uG=X.Nr.prototype
 C.Xo=U.DK.prototype
 C.cI=N.BS.prototype
 C.Cs=O.Vb.prototype
@@ -18079,12 +17533,12 @@
 C.Wa=E.av.prototype
 C.bZ=E.uz.prototype
 C.iR=E.Ma.prototype
-C.J0=E.wN.prototype
+C.RVQ=E.wN.prototype
 C.wP=E.ds.prototype
 C.Ag=E.Mb.prototype
 C.Tl=E.oF.prototype
 C.wK=E.qh.prototype
-C.rU=E.Q6.prototype
+C.to=E.Q6.prototype
 C.za=E.L4.prototype
 C.ij=E.Zn.prototype
 C.Rr=E.uE.prototype
@@ -18098,11 +17552,11 @@
 C.LN=N.oa.prototype
 C.F2=D.IW.prototype
 C.Ji=D.Oz.prototype
-C.B2=D.St.prototype
+C.Hj=D.St.prototype
 C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
 C.YI=J.Pp.prototype
-C.jn=J.Xh.prototype
+C.jn=J.L7.prototype
 C.jN=J.ht.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
@@ -18112,15 +17566,15 @@
 C.MG=M.CX.prototype
 C.yp=H.eEV.prototype
 C.kD=A.md.prototype
-C.pl=A.ye.prototype
 C.SU=A.Bm.prototype
 C.nn=A.Ya.prototype
 C.J7=A.Ww.prototype
 C.t5=W.BH.prototype
 C.k0=V.F1.prototype
-C.Pfz=Z.uL.prototype
+C.mk=Z.uL.prototype
 C.Sx=J.iC.prototype
-C.Ki=A.xc.prototype
+C.Ki=A.ir.prototype
+C.Vp=Q.qZ.prototype
 C.oA=T.ov.prototype
 C.Mh=A.kn.prototype
 C.FH=U.fI.prototype
@@ -18143,8 +17597,8 @@
 C.pr=new P.mgb()
 C.dV=new L.iNc()
 C.NU=new P.R81()
-C.dS=new P.AH()
-C.WA=new D.WAE("Collected")
+C.v8=new P.AH()
+C.wV=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
 C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
@@ -18152,232 +17606,233 @@
 C.nU=new A.iYn(0)
 C.BM=new A.iYn(1)
 C.it=new A.iYn(2)
-C.YT=new H.IN("expr")
-C.eP=H.IL('dynamic')
+C.YT=new H.GD("expr")
+C.HH=H.IL('dynamic')
 C.NS=new K.vly()
-C.oiA=new A.A2()
+C.px=new A.A2()
 I.ko=function(a){a.immutable$list=init
 a.fixed$length=init
 return a}
-C.XVh=I.ko([C.NS,C.oiA])
-C.V0=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.XVh)
-C.rB=new H.IN("isolate")
-C.a2p=H.IL('bv')
-C.ZQ=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.XVh)
-C.Ms=new H.IN("iconClass")
+C.XVh=I.ko([C.NS,C.px])
+C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
+C.rB=new H.GD("isolate")
+C.Ks=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ks,!1,C.XVh)
+C.Ms=new H.GD("iconClass")
 C.Db=H.IL('qU')
-C.mI=new K.nd()
-C.X0=I.ko([C.NS,C.mI])
-C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.X0)
-C.VK=new H.IN("devtools")
+C.J19=new K.ndx()
+C.y0=I.ko([C.NS,C.J19])
+C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.y0)
+C.VK=new H.GD("devtools")
 C.BQ=H.IL('a2')
 C.m8=new A.ES(C.VK,C.BM,!1,C.BQ,!1,C.XVh)
-C.EV=new H.IN("library")
+C.EV=new H.GD("library")
 C.Jny=H.IL('U4')
 C.Ei=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.XVh)
-C.zU=new H.IN("uncheckedText")
+C.zU=new H.GD("uncheckedText")
 C.IK=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.XVh)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.IL('EH')
+C.UL=new H.GD("profileChanged")
+C.dg=H.IL('EH')
 C.xD=I.ko([])
-C.mM=new A.ES(C.UL,C.it,!1,C.yQP,!1,C.xD)
-C.Ql=new H.IN("hasClass")
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.X0)
-C.B0=new H.IN("expand")
+C.mM=new A.ES(C.UL,C.it,!1,C.dg,!1,C.xD)
+C.Ql=new H.GD("hasClass")
+C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.y0)
+C.B0=new H.GD("expand")
 C.Rf=new A.ES(C.B0,C.BM,!1,C.BQ,!1,C.XVh)
-C.kV=new H.IN("link")
+C.kV=new H.GD("link")
 C.Os=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.XVh)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.it,!1,C.yQP,!1,C.xD)
-C.SA=new H.IN("lines")
+C.Wm=new H.GD("refChanged")
+C.QW=new A.ES(C.Wm,C.it,!1,C.dg,!1,C.xD)
+C.SA=new H.GD("lines")
 C.hAX=H.IL('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.bJ=new H.IN("counters")
+C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.y0)
+C.bJ=new H.GD("counters")
 C.jJ=H.IL('qC')
 C.iF=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.XVh)
-C.cg=new H.IN("anchor")
+C.cg=new H.GD("anchor")
 C.pU=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.XVh)
-C.fn=new H.IN("instance")
-C.fX=H.IL('vO')
-C.cV=new A.ES(C.fn,C.BM,!1,C.fX,!1,C.XVh)
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.aH=new H.IN("displayCutoff")
-C.xY=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.uk=new H.IN("last")
+C.fn=new H.GD("instance")
+C.MR1=H.IL('vO')
+C.cV=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.XVh)
+C.aH=new H.GD("displayCutoff")
+C.hR=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.y0)
+C.uk=new H.GD("last")
 C.Mq=new A.ES(C.uk,C.BM,!1,C.BQ,!1,C.XVh)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.it,!1,C.yQP,!1,C.xD)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.it,!1,C.yQP,!1,C.xD)
-C.Mc=new H.IN("flagList")
-C.XV=new A.ES(C.Mc,C.BM,!1,C.fX,!1,C.XVh)
-C.QH=new H.IN("fragmentation")
-C.kt=new A.ES(C.QH,C.BM,!1,C.fX,!1,C.XVh)
-C.td=new H.IN("object")
+C.bz=new H.GD("isolateChanged")
+C.Bk=new A.ES(C.bz,C.it,!1,C.dg,!1,C.xD)
+C.CG=new H.GD("posChanged")
+C.Ml=new A.ES(C.CG,C.it,!1,C.dg,!1,C.xD)
+C.Mc=new H.GD("flagList")
+C.XV=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.XVh)
+C.QH=new H.GD("fragmentation")
+C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
+C.td=new H.GD("object")
 C.SmN=H.IL('af')
 C.No=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.XVh)
-C.SR=new H.IN("map")
-C.HL=new A.ES(C.SR,C.BM,!1,C.fX,!1,C.XVh)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.kw=new H.IN("trace")
-C.W9=new A.ES(C.kw,C.BM,!1,C.fX,!1,C.XVh)
-C.uu=new H.IN("internal")
+C.SR=new H.GD("map")
+C.HL=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.XVh)
+C.Gs=new H.GD("sampleCount")
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.y0)
+C.kw=new H.GD("trace")
+C.W9=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.XVh)
+C.uu=new H.GD("internal")
 C.x3=new A.ES(C.uu,C.BM,!1,C.BQ,!1,C.XVh)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.nf=new H.IN("function")
-C.Up=new A.ES(C.nf,C.BM,!1,C.fX,!1,C.XVh)
-C.Ys=new H.IN("pad")
+C.TW=new H.GD("tagSelector")
+C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.y0)
+C.nf=new H.GD("function")
+C.Up=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.XVh)
+C.Ys=new H.GD("pad")
 C.hK=new A.ES(C.Ys,C.BM,!1,C.BQ,!1,C.XVh)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!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.Gr=new H.IN("endPos")
+C.He=new H.GD("hideTagsChecked")
+C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!1,C.y0)
+C.zz=new H.GD("timeSpan")
+C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.y0)
+C.Gr=new H.GD("endPos")
 C.yw=H.IL('KN')
 C.j3=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.XVh)
-C.mr=new H.IN("expanded")
-C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.X0)
-C.xP=new H.IN("ref")
+C.mr=new H.GD("expanded")
+C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
+C.j2=new H.GD("app")
+C.jY=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.jY,!1,C.XVh)
+C.xP=new H.GD("ref")
 C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
-C.jU=new H.IN("file")
-C.v0=new A.ES(C.jU,C.BM,!1,C.fX,!1,C.XVh)
-C.qs=new H.IN("io")
-C.ly=new A.ES(C.qs,C.BM,!1,C.fX,!1,C.XVh)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.it,!1,C.yQP,!1,C.xD)
-C.i0=new H.IN("coverageChanged")
-C.GH=new A.ES(C.i0,C.it,!1,C.yQP,!1,C.xD)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.it,!1,C.yQP,!1,C.xD)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.it,!1,C.yQP,!1,C.xD)
-C.aP=new H.IN("active")
+C.jU=new H.GD("file")
+C.v0=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.XVh)
+C.qs=new H.GD("io")
+C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
+C.qX=new H.GD("fragmentationChanged")
+C.dO=new A.ES(C.qX,C.it,!1,C.dg,!1,C.xD)
+C.i0=new H.GD("coverageChanged")
+C.GH=new A.ES(C.i0,C.it,!1,C.dg,!1,C.xD)
+C.pO=new H.GD("functionChanged")
+C.au=new A.ES(C.pO,C.it,!1,C.dg,!1,C.xD)
+C.rP=new H.GD("mapChanged")
+C.Nt=new A.ES(C.rP,C.it,!1,C.dg,!1,C.xD)
+C.aP=new H.GD("active")
 C.xO=new A.ES(C.aP,C.BM,!1,C.BQ,!1,C.XVh)
-C.WQ=new H.IN("field")
-C.NA=new A.ES(C.WQ,C.BM,!1,C.fX,!1,C.XVh)
-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.WQ=new H.GD("field")
+C.NA=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.XVh)
+C.YD=new H.GD("sampleRate")
+C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
+C.Aa=new H.GD("results")
 C.Gu=H.IL('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.X0)
-C.t6=new H.IN("mapAsString")
-C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.hf=new H.IN("label")
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gu,!1,C.y0)
+C.t6=new H.GD("mapAsString")
+C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
+C.hf=new H.GD("label")
 C.n6=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.XVh)
-C.XA=new H.IN("cls")
-C.jF=H.IL('dy')
-C.by=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.XVh)
-C.UY=new H.IN("result")
+C.UY=new H.GD("result")
 C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
-C.PX=new H.IN("script")
-C.KB=H.IL('vx')
-C.Cj=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.XVh)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
+C.PX=new H.GD("script")
+C.c3=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.c3,!1,C.XVh)
+C.S4=new H.GD("busy")
+C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
+C.AO=new H.GD("qualifiedName")
 C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
-C.OO=new H.IN("flag")
+C.OO=new H.GD("flag")
 C.RM=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.XVh)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.CO=new A.ES(C.XA,C.BM,!1,C.fX,!1,C.XVh)
-C.pH=new H.IN("small")
-C.CN=new A.ES(C.pH,C.BM,!1,C.BQ,!1,C.XVh)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.kz=new H.IN("showCoverageChanged")
-C.db=new A.ES(C.kz,C.it,!1,C.yQP,!1,C.xD)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.it,!1,C.yQP,!1,C.xD)
-C.bk=new H.IN("checked")
+C.eh=new H.GD("lineMode")
+C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
+C.XA=new H.GD("cls")
+C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.fV=new H.GD("small")
+C.CN=new A.ES(C.fV,C.BM,!1,C.BQ,!1,C.XVh)
+C.AV=new H.GD("callback")
+C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
+C.PM=new H.GD("status")
+C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.y0)
+C.kz=new H.GD("showCoverageChanged")
+C.db=new A.ES(C.kz,C.it,!1,C.dg,!1,C.xD)
+C.ox=new H.GD("countersChanged")
+C.Rh=new A.ES(C.ox,C.it,!1,C.dg,!1,C.xD)
+C.bk=new H.GD("checked")
 C.Nu=new A.ES(C.bk,C.BM,!1,C.BQ,!1,C.XVh)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
+C.bE=new H.GD("sampleDepth")
+C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.y0)
+C.tW=new H.GD("pos")
 C.HM=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.XVh)
-C.RJ=new H.IN("vm")
+C.RJ=new H.GD("vm")
 C.n8S=H.IL('wv')
 C.Ce=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.XVh)
-C.WZ=new H.IN("coverage")
+C.WZ=new H.GD("coverage")
 C.Um=new A.ES(C.WZ,C.BM,!1,C.BQ,!1,C.XVh)
-C.AV=new H.IN("callback")
-C.QiO=H.IL('Sa')
-C.ti=new A.ES(C.AV,C.BM,!1,C.QiO,!1,C.XVh)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.it,!1,C.yQP,!1,C.xD)
-C.UX=new H.IN("msg")
-C.X4=new A.ES(C.UX,C.BM,!1,C.fX,!1,C.XVh)
-C.j2=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.XVh)
-C.rE=new H.IN("frame")
+C.wu=H.IL('Sa')
+C.ti=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.XVh)
+C.N8=new H.GD("scriptChanged")
+C.qE=new A.ES(C.N8,C.it,!1,C.dg,!1,C.xD)
+C.UX=new H.GD("msg")
+C.X4=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.XVh)
+C.rE=new H.GD("frame")
 C.Kv=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.XVh)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bw=new A.ES(C.xS,C.it,!1,C.yQP,!1,C.xD)
-C.kG=new H.IN("classTable")
+C.ak=new H.GD("hasParent")
+C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.y0)
+C.xS=new H.GD("tagSelectorChanged")
+C.bw=new A.ES(C.xS,C.it,!1,C.dg,!1,C.xD)
+C.kG=new H.GD("classTable")
 C.HjP=H.IL('Vz')
-C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.X0)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.i4=new H.IN("code")
+C.dh=new A.ES(C.kG,C.BM,!1,C.HjP,!1,C.y0)
+C.Dj=new H.GD("refreshTime")
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
+C.i4=new H.GD("code")
 C.nq=H.IL('kx')
 C.h9=new A.ES(C.i4,C.BM,!1,C.nq,!1,C.XVh)
-C.oj=new H.IN("httpServer")
-C.dF=new A.ES(C.oj,C.BM,!1,C.fX,!1,C.XVh)
-C.vb=new H.IN("profile")
-C.eq=new A.ES(C.vb,C.BM,!1,C.fX,!1,C.XVh)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.X0)
-C.Ve=new H.IN("socket")
+C.oj=new H.GD("httpServer")
+C.dF=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.XVh)
+C.vb=new H.GD("profile")
+C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
+C.a0=new H.GD("isDart")
+C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Ve=new H.GD("socket")
 C.Xmq=H.IL('WP')
 C.Gg=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.XVh)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.it,!1,C.yQP,!1,C.xD)
-C.ne=new H.IN("exception")
+C.Gn=new H.GD("objectChanged")
+C.az=new A.ES(C.Gn,C.it,!1,C.dg,!1,C.xD)
+C.ne=new H.GD("exception")
 C.SNu=H.IL('EP')
 C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
-C.Wj=new H.IN("process")
-C.FN=new A.ES(C.Wj,C.BM,!1,C.fX,!1,C.XVh)
-C.QK=new H.IN("qualified")
+C.Wj=new H.GD("process")
+C.FN=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.XVh)
+C.QK=new H.GD("qualified")
 C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
-C.yh=new H.IN("error")
+C.yh=new H.GD("error")
 C.k5t=H.IL('ft')
 C.yc=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.XVh)
 C.oUD=H.IL('N7')
 C.xQ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.XVh)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.it,!1,C.yQP,!1,C.xD)
-C.XY=new H.IN("showCoverage")
+C.r1=new H.GD("expandChanged")
+C.nP=new A.ES(C.r1,C.it,!1,C.dg,!1,C.xD)
+C.XY=new H.GD("showCoverage")
 C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
-C.Lc=new H.IN("kind")
+C.Lc=new H.GD("kind")
 C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
-C.YE=new H.IN("webSocket")
-C.Xt=new A.ES(C.YE,C.BM,!1,C.fX,!1,C.XVh)
-C.ngm=I.ko([C.mI])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ngm)
-C.lH=new H.IN("checkedText")
+C.YE=new H.GD("webSocket")
+C.Xt=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.XVh)
+C.ng=I.ko([C.J19])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ng)
+C.lH=new H.GD("checkedText")
 C.A5=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.XVh)
 C.GE=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.XVh)
-C.XM=new H.IN("path")
-C.hL=new A.ES(C.XM,C.BM,!1,C.fX,!1,C.XVh)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.vp=new H.IN("list")
-C.K9=new A.ES(C.vp,C.BM,!1,C.fX,!1,C.XVh)
-C.PI=new H.IN("displayValue")
-C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.X0)
+C.XM=new H.GD("path")
+C.hL=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.XVh)
+C.mi=new H.GD("text")
+C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.y0)
+C.vp=new H.GD("list")
+C.K9=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.XVh)
+C.PI=new H.GD("displayValue")
+C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
 C.ny=new P.a6(0)
 C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.nI=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kQ])
+C.nI=H.VM(new W.FkO("click"),[W.Oq])
+C.d6=H.VM(new W.FkO("close"),[W.K3])
+C.MD=H.VM(new W.FkO("error"),[W.ea])
+C.yZ=H.VM(new W.FkO("hashchange"),[W.ea])
 C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kQ])
 C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.Hj=H.VM(new W.FkO("popstate"),[W.dg])
+C.uh=H.VM(new W.FkO("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.FkO("mousemove"),[W.Oq])
+C.Mp=H.VM(new W.FkO("open"),[W.ea])
 C.mp=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
@@ -18509,25 +17964,23 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.xr=new P.pE(null,null)
+C.xr=new P.D4(null,null)
 C.A3=new P.Cf(null)
 C.Sr=new P.ze(null,null)
 C.Ab=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
+C.t4=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
 C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-C.SV=new H.IN("keys")
-C.Yn=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
+C.SV=new H.GD("keys")
+C.Yn=new H.GD("values")
+C.Wn=new H.GD("length")
+C.ai=new H.GD("isEmpty")
+C.nZ=new H.GD("isNotEmpty")
 C.WK=I.ko([C.SV,C.Yn,C.Wn,C.ai,C.nZ])
 C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.IL('nd')
-C.Cd=I.ko([C.N4])
 C.G8=I.ko(["==","!=","<=",">=","||","&&"])
-C.WJ=I.ko(["in","this"])
+C.Cd=I.ko(["in","this"])
 C.QC=I.ko(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
 C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
 C.ML=I.ko([40,41,91,93,123,125])
@@ -18541,7 +17994,7 @@
 C.V0I=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
 C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.V0I)
 C.MEG=I.ko(["enumerate"])
-C.eu=new H.Px(1,{enumerate:K.zp()},C.MEG)
+C.eu=new H.Px(1,{enumerate:K.G5()},C.MEG)
 C.tq=H.IL('Bo')
 C.uwj=H.IL('wA')
 C.wE=I.ko([C.uwj])
@@ -18553,160 +18006,150 @@
 C.Cn=new D.l8R("Listening")
 C.qp=new D.l8R("Normal")
 C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.US=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.Ph=new H.IN("back")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.Ka=new H.IN("call")
-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.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-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.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.Uj=new H.IN("forward")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.Uq=new H.IN("getFormattedValue")
-C.A8=new H.IN("getValue")
-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.Ge=new H.IN("hashLinkWorkaround")
-C.wq=new H.IN("hitStyle")
-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.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.h7=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.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-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.So=new H.IN("newHeapCapacity")
-C.EK=new H.IN("newHeapUsed")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.eH=new H.IN("oldHeapCapacity")
-C.ap=new H.IN("oldHeapUsed")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-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.yL=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.DW=new H.IN("sortedRows")
-C.Pf=new H.IN("stacktrace")
-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.hN=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.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.jh=new H.IN("v")
-C.zdr=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.IL('hx')
+C.IH=new H.GD("address")
+C.US=new H.GD("architecture")
+C.Zg=new H.GD("args")
+C.ET=new H.GD("assertsEnabled")
+C.WC=new H.GD("bpt")
+C.Ro=new H.GD("buttonClick")
+C.Ka=new H.GD("call")
+C.C0=new H.GD("change")
+C.eZ=new H.GD("changeSort")
+C.OI=new H.GD("classes")
+C.To=new H.GD("closing")
+C.qt=new H.GD("coloring")
+C.p1=new H.GD("columns")
+C.M8=new H.GD("currentHash")
+C.iE=new H.GD("descriptor")
+C.f4=new H.GD("descriptors")
+C.aK=new H.GD("doAction")
+C.GP=new H.GD("element")
+C.tP=new H.GD("entry")
+C.Zb=new H.GD("eval")
+C.u7=new H.GD("evalNow")
+C.Ek=new H.GD("expander")
+C.Pn=new H.GD("expanderStyle")
+C.R3=new H.GD("fd")
+C.Gd=new H.GD("firstTokenPos")
+C.FP=new H.GD("formatSize")
+C.kF=new H.GD("formatTime")
+C.UD=new H.GD("formattedAddress")
+C.Aq=new H.GD("formattedAverage")
+C.DS=new H.GD("formattedCollections")
+C.C9=new H.GD("formattedDeoptId")
+C.VF=new H.GD("formattedExclusive")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.YJ=new H.GD("formattedInclusive")
+C.eF=new H.GD("formattedInclusiveTicks")
+C.oI=new H.GD("formattedLine")
+C.ST=new H.GD("formattedTotalCollectionTime")
+C.EI=new H.GD("functions")
+C.JB=new H.GD("getColumnLabel")
+C.Uq=new H.GD("getFormattedValue")
+C.A8=new H.GD("getValue")
+C.SI=new H.GD("hasDescriptors")
+C.zS=new H.GD("hasDisassembly")
+C.eo=new H.GD("hashLink")
+C.Ge=new H.GD("hashLinkWorkaround")
+C.wq=new H.GD("hitStyle")
+C.k6=new H.GD("hoverText")
+C.PJ=new H.GD("human")
+C.q2=new H.GD("idle")
+C.d2=new H.GD("imp")
+C.kN=new H.GD("imports")
+C.eJ=new H.GD("instruction")
+C.iG=new H.GD("instructions")
+C.Py=new H.GD("interface")
+C.h7=new H.GD("ioEnabled")
+C.I9=new H.GD("isBool")
+C.C1=new H.GD("isComment")
+C.Yg=new H.GD("isDartCode")
+C.bR=new H.GD("isDouble")
+C.ob=new H.GD("isError")
+C.Iv=new H.GD("isInstance")
+C.Wg=new H.GD("isInt")
+C.tD=new H.GD("isList")
+C.Of=new H.GD("isNull")
+C.pY=new H.GD("isOptimized")
+C.LA=new H.GD("isPipe")
+C.Lk=new H.GD("isString")
+C.dK=new H.GD("isType")
+C.xf=new H.GD("isUnexpected")
+C.Jx=new H.GD("isolates")
+C.b5=new H.GD("jumpTarget")
+C.kA=new H.GD("lastTokenPos")
+C.ur=new H.GD("lib")
+C.VN=new H.GD("libraries")
+C.VI=new H.GD("line")
+C.cc=new H.GD("listening")
+C.DY=new H.GD("loading")
+C.Lx=new H.GD("localAddress")
+C.M3=new H.GD("localPort")
+C.wT=new H.GD("mainPort")
+C.pX=new H.GD("message")
+C.VD=new H.GD("mouseOut")
+C.NN=new H.GD("mouseOver")
+C.YS=new H.GD("name")
+C.pu=new H.GD("nameIsEmpty")
+C.So=new H.GD("newHeapCapacity")
+C.EK=new H.GD("newHeapUsed")
+C.OV=new H.GD("noSuchMethod")
+C.zO=new H.GD("objectPool")
+C.eH=new H.GD("oldHeapCapacity")
+C.ap=new H.GD("oldHeapUsed")
+C.zm=new H.GD("padding")
+C.Ic=new H.GD("pause")
+C.yG=new H.GD("pauseEvent")
+C.AY=new H.GD("protocol")
+C.I7=new H.GD("readClosed")
+C.GR=new H.GD("refresh")
+C.KX=new H.GD("refreshCoverage")
+C.ja=new H.GD("refreshGC")
+C.MT=new H.GD("registerCallback")
+C.Gi=new H.GD("relativeHashLink")
+C.yL=new H.GD("remoteAddress")
+C.ni=new H.GD("remotePort")
+C.X2=new H.GD("resetAccumulator")
+C.F3=new H.GD("response")
+C.nY=new H.GD("resume")
+C.HD=new H.GD("retainedSize")
+C.iU=new H.GD("retainingPath")
+C.eN=new H.GD("rootLib")
+C.ue=new H.GD("row")
+C.nh=new H.GD("rows")
+C.L2=new H.GD("running")
+C.EA=new H.GD("scripts")
+C.oW=new H.GD("selectExpr")
+C.hd=new H.GD("serviceType")
+C.jM=new H.GD("socketOwner")
+C.DW=new H.GD("sortedRows")
+C.Pf=new H.GD("stacktrace")
+C.Nv=new H.GD("subclass")
+C.hO=new H.GD("tipExclusive")
+C.ei=new H.GD("tipKind")
+C.HK=new H.GD("tipParent")
+C.je=new H.GD("tipTicks")
+C.hN=new H.GD("tipTime")
+C.Q1=new H.GD("toggleExpand")
+C.ID=new H.GD("toggleExpanded")
+C.z6=new H.GD("tokenPos")
+C.bc=new H.GD("topFrame")
+C.Kj=new H.GD("totalSamplesInProfile")
+C.ep=new H.GD("tree")
+C.J2=new H.GD("typeChecksEnabled")
+C.bn=new H.GD("updateLineMode")
+C.mh=new H.GD("uptime")
+C.Fh=new H.GD("url")
+C.jh=new H.GD("v")
+C.zdr=new H.GD("value")
+C.fj=new H.GD("variable")
+C.xw=new H.GD("variables")
+C.zn=new H.GD("version")
+C.Tc=new H.GD("vmName")
+C.Uy=new H.GD("writeClosed")
+C.k5=H.IL('hx')
 C.hP=H.IL('uz')
+C.KS=H.IL('oD')
 C.Mf=H.IL('G1')
 C.q0S=H.IL('Dg')
 C.Dl=H.IL('F1')
@@ -18717,7 +18160,8 @@
 C.kq=H.IL('Nn')
 C.j4=H.IL('IW')
 C.Vx=H.IL('MJ')
-C.Vh=H.IL('Pz')
+C.Vh=H.IL('qZ')
+C.dH=H.IL('Pz')
 C.HC=H.IL('F0')
 C.rR=H.IL('wN')
 C.yS=H.IL('G6')
@@ -18738,6 +18182,7 @@
 C.dD=H.IL('av')
 C.FA=H.IL('Ya')
 C.T1=H.IL('Wy')
+C.hG=H.IL('ir')
 C.Th=H.IL('fI')
 C.tU=H.IL('L4')
 C.yT=H.IL('FK')
@@ -18757,7 +18202,6 @@
 C.lp=H.IL('LU')
 C.oG=H.IL('ds')
 C.TU=H.IL('Oz')
-C.nw=H.IL('eo')
 C.OG=H.IL('eW')
 C.oZ=H.IL('HS')
 C.km=H.IL('fl')
@@ -18776,12 +18220,9 @@
 C.qF=H.IL('mO')
 C.Ey=H.IL('wM')
 C.nX=H.IL('DE')
-C.jw=H.IL('xc')
 C.bh=H.IL('i6')
-C.NW=H.IL('ye')
 C.jRi=H.IL('we')
 C.Xv=H.IL('n5')
-C.XI=H.IL('cn')
 C.KO=H.IL('ZP')
 C.Wz=H.IL('pR')
 C.Ep=H.IL('ou')
@@ -18806,7 +18247,6 @@
 C.jK=H.IL('el')
 C.xM=new P.u5F(!1)
 $.libraries_to_load = {}
-$.Fd=1
 $.H9="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
@@ -18816,10 +18256,9 @@
 $.NF=null
 $.TX=null
 $.x7=null
-$.q4=null
+$.nw=null
 $.vv=null
 $.Bv=null
-$.W5=null
 $.BY=null
 $.oK=null
 $.S6=null
@@ -18833,7 +18272,7 @@
 $.Y1=0
 $.ax=0
 $.iq=null
-$.Td=!1
+$.AM=!1
 $.ps=0
 $.xG=null
 $.Bh=0
@@ -18843,10 +18282,10 @@
 $.UG=!0
 $.RQ="objects/"
 $.vU=null
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dmb},C.Vx,X.MJ,{created:X.Bs},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.Dw},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.TsF},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.JR},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.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.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.bh,R.i6,{created:R.IT},C.NW,A.ye,{created:A.W1},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.NZ},C.KO,F.ZP,{created:F.Zg},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.EG},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.KM},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.hP,E.uz,{created:E.fr},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.pD},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vx,X.MJ,{created:X.Bs},C.Vh,Q.qZ,{created:Q.RH},C.rR,E.wN,{created:E.wZ7},C.yS,B.G6,{created:B.KU},C.z7,D.YA,{created:D.BP},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.J3z},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.qb},C.BL,X.Nr,{created:X.na},C.ON,T.ov,{created:T.Zz},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.ce,X.kK,{created:X.os},C.dD,E.av,{created:E.R7},C.FA,A.Ya,{created:A.vn},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.TXt},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.lt},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.eg},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.JR},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.DCi},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.qa},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.ic},C.Xv,E.n5,{created:E.xx},C.KO,F.ZP,{created:F.Yw},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.dv},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.N0},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.dP},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.Ut},C.mq,L.qk,{created:L.Za},C.XW,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
 I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","ma",function(){return $.jk().window})
-I.$lazy($,"globalWorker","ae","RG",function(){return $.jk().Worker})
+I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
+I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
 I.$lazy($,"thisScript","Kb","Rs",function(){return H.yl()})
 I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
@@ -18864,8 +18303,8 @@
 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.PG(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
+I.$lazy($,"_toStringVisiting","nM","Ex",function(){return P.yv(null)})
+I.$lazy($,"_toStringList","yu","tw",function(){return[]})
 I.$lazy($,"webkitEvents","Ha","PO",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
 I.$lazy($,"context","Lt","ca",function(){return P.ND(function(){return this}())})
 I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","LZ",function(){return init.getIsolateTag("_$dart_dartObject")})
@@ -18873,17 +18312,17 @@
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
 I.$lazy($,"_freeColor","nK","Rl",function(){return[255,255,255,255]})
 I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","KT","tQ",function(){return P.Fl(P.qU,N.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
+I.$lazy($,"_logger","y7","eI",function(){return N.QM("Observable.dirtyCheck")})
 I.$lazy($,"_instance","qr","V6",function(){return new L.Ul([])})
 I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
-I.$lazy($,"_logger","jz","Br",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_logger","jz","T5",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
 I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
 I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
 I.$lazy($,"_hasShadowDomPolyfill","jQ","Nc",function(){return $.ca().Eg("ShadowDOMPolyfill")})
 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($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.NL())})
 I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
 I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
 I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
@@ -18893,13 +18332,13 @@
 I.$lazy($,"_ready","T6","ln",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
 I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
 I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_unbindLog","pH","EM",function(){return N.QM("polymer.unbind")})
 I.$lazy($,"_bindLog","f2","zB",function(){return N.QM("polymer.bind")})
 I.$lazy($,"_shadowHost","zr","c7",function(){return H.VM(new P.kM(null),[A.dM])})
 I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","AM","qL",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","qM","Js",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","cZ","Dw",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
 I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
 I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
 I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
@@ -18907,12 +18346,12 @@
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_allTemplatesSelectors","Qn","i8",function(){return"template, "+J.kl(C.z5.gvc(),new M.W6o()).zV(0,", ")})
 I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={Sa:202}
-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:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"Gm",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code","msg","errorMessage","message",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.dg]},{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Df",ret:P.qU,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.h4]},"detail","target","objectClass",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{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:"rf",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"Jw",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.GD,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",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:"qt",ret:P.QV,args:[P.qU]}]},{func:"pw",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"d4C",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"BN",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.dl]},{func:"h2",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},"s",{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k",{func:"Hb",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]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"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:"Br",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",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"w9",ret:P.b8,args:[P.qU]},];$=null
+init.functionAliases={Sa:187}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.qK,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"ie",ret:{func:"aB",args:[null]},args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"Uk",ret:P.Xa,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"xh",ret:P.KN,args:[P.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"Z5",ret:P.a2,args:[P.IN]},"symbol","v","x",{func:"qq",ret:[P.QV,K.O1],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"lQ",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"SF",args:[P.a2]},{func:"a9",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},{func:"QO",void:true,args:[W.Oq]},"result",{func:"jH",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"rI",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.qK,P.dl]},{func:"h2",args:[P.dl,P.qK,P.dl,{func:"aB",args:[null]}]},"s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"K7",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k",{func:"Hb",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]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"Br",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func",{func:"lb",void:true,args:[W.AW]},"socket","msg","details",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:P.b8,args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
index c155e5d..c104893 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
@@ -4,7 +4,6 @@
   <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">
@@ -31,6 +30,7 @@
   <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/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index 558df19..564dad4 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -8,9 +8,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('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>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
index ae35925..0b595f6 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <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>
+<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 8ac2639..7548085 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -16,18 +16,17 @@
     <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.isAbstract }}">
+        <template if="{{ cls['abstract'] }}">
           abstract
         </template>
-        <template if="{{ cls.isPatch }}">
+        <template if="{{ cls['patch'] }}">
           patch
         </template>
         class {{ cls.name }}
@@ -36,32 +35,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.superClass != null }}">
+        <template if="{{ cls['super'] != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls['super'] }}"></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>
@@ -70,11 +69,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>
@@ -95,19 +94,19 @@
       </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>
@@ -123,11 +122,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 }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index 14ba961..e14384c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -6,10 +6,10 @@
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
+          <a href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+          <a href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index db45db9..f04fd06 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -57,7 +57,6 @@
       <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 }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index dd33743..ba54e66 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -7,7 +7,6 @@
     <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>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
index 709ae9b9..6de1a19 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -17,7 +17,7 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
   <script type="application/dart" src="field_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index 5464260..5673bbf 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -19,9 +19,8 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html
index 58c4460..cabdd91 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/flag_list.html
@@ -9,9 +9,8 @@
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('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/deployed/web/packages/observatory/src/elements/function_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
index 0051e18..70e5e96 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
@@ -10,7 +10,7 @@
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 <script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index ccb44e7..eb5bf6b 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -21,9 +21,8 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index 96cf469..9f5b556 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -22,9 +22,8 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('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>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index fe5f2fc..aea9cd7 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -41,11 +41,10 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap 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">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index b31dac0..943ccda 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -34,16 +34,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] != null}}">
-        <a on-click="{{ goto }}" href="{{ url }}">
+        <a 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 on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_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 on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index a9293cd..215d670 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -19,7 +19,6 @@
       <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 }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html
index c1d5692..4343aec 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/io_view.html
@@ -10,7 +10,6 @@
     <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">
@@ -20,7 +19,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -28,7 +27,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
         </li>
       </ul>
 
@@ -36,7 +35,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
         </li>
       </ul>
 
@@ -44,7 +43,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -52,7 +51,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
         </li>
       </ul>
 
@@ -110,7 +109,7 @@
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -159,7 +158,7 @@
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -289,7 +288,7 @@
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -349,7 +348,7 @@
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -445,10 +444,10 @@
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+      <a href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index e1c522e..b15b9fc 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -11,9 +11,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
index 883e556..84e4e66 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
@@ -1,8 +1,9 @@
+<head>
 <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 on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a 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/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index 5aa8dd4..9ed1e77 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -145,33 +145,28 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            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>
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
           </div>
         </div>
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
         </template>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index 5de18e6..794b50a 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -28,7 +28,6 @@
       <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">
@@ -100,7 +99,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index 4319f09..5dbfc55 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -4,10 +4,10 @@
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
   <template if="{{ nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    <a href="{{ url }}">unnamed</a>
   </template>
   <template if="{{ !nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index 6c30fd7..9b4e339 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -19,7 +19,6 @@
       <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">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 915b647..fd4f762 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -81,7 +81,7 @@
     </style>
 
     <li class="menu">
-      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -129,7 +129,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+    <li><a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -165,31 +165,9 @@
   </template>
 </polymer-element>
 
-<polymer-element name="nav-control" extends="observatory-element">
-  <template>
-    <style>
-      .black {
-        color: #000;
-      }
-      li {
-        float: right;
-        margin: 0;
-      }
-      li button {
-        margin: 3px;
-        padding: 8px;
-      }
-    </style>
-    <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>
@@ -198,15 +176,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.relativeLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('profile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
                      anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -215,7 +193,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.link }}"
+    <nav-menu link="{{ library.hashLink }}"
               anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
@@ -224,7 +202,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.link }}"
+    <nav-menu link="{{ cls.hashLink }}"
               anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
index d933140..0d34af3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
@@ -1,8 +1,10 @@
 <head>
   <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_view.html">
+  <link rel="import" href="response_viewer.html">
 </head>
 <polymer-element name="observatory-application" extends="observatory-element">
-  <!-- This element explicitly manages its child elements -->
+  <template>
+    <response-viewer app="{{ this.app }}"></response-viewer>
+  </template>
   <script type="application/dart" src="observatory_application.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
index 63825a8..07f27f2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
@@ -5,7 +5,7 @@
 <polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="css/shared.css">
-  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index 07cd6dc..accb51f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -17,8 +17,8 @@
       </li>
     </nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    <nav-control></nav-control>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index eee6a16..95e7972 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -7,7 +7,6 @@
     <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>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index f54a5e1..855417e 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -7,7 +7,6 @@
     <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>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index 1b66ce7..bd3e569 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -9,9 +9,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('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">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
index 711d20b..07155df 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
index d54e35c..226d085 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
@@ -15,7 +15,6 @@
     <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">
@@ -40,7 +39,7 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
+            See <a href="#/flags">flags</a>
           </div>
         </div>
       </div>
diff --git a/runtime/bin/vmservice/client/lib/app.dart b/runtime/bin/vmservice/client/lib/app.dart
index d5c788b..e1b13b6 100644
--- a/runtime/bin/vmservice/client/lib/app.dart
+++ b/runtime/bin/vmservice/client/lib/app.dart
@@ -11,7 +11,6 @@
 
 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 bc10214..146b624 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -4,7 +4,6 @@
 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';
@@ -32,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/observatory_element.dart';
+export 'package:observatory/src/elements/response_viewer.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 c155e5d..c104893 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -4,7 +4,6 @@
   <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">
@@ -31,6 +30,7 @@
   <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 df4d74d..1a892aa 100644
--- a/runtime/bin/vmservice/client/lib/service_html.dart
+++ b/runtime/bin/vmservice/client/lib/service_html.dart
@@ -32,28 +32,19 @@
   }
 
   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.request(host + id,
-                               requestHeaders: {
-                                  'Observatory-Version': '1.0'
-                               }).then((HttpRequest request) {
-        return request.responseText;
-      }).catchError((error) {
+    return HttpRequest.getString(host + id).catchError((error) {
       // If we get an error here, the network request has failed.
-      Logger.root.severe('HttpRequest.request failed.');
+      Logger.root.severe('HttpRequest.getString failed.');
       var request = error.target;
       return JSON.encode({
           'type': 'ServiceException',
           'id': '',
-          'response': request.responseText,
+          'response': error.target.responseText,
           'kind': 'NetworkException',
-          'message': 'Could not connect to service (${request.statusText}). '
-                     'Check that you started the VM with the following flags: '
-                     '--observe'
+          'message': 'Could not connect to service. Check that you started the'
+                     ' VM with the following flags:\n --enable-vm-service'
+                    ' --pause-isolates-on-exit'
         });
     });
   }
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
index 7acdb1c..e10fa76 100644
--- a/runtime/bin/vmservice/client/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -4,203 +4,53 @@
 
 part of app;
 
-/// 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));
-    /// 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/');
-}
+/// A request response interceptor is called for each response.
+typedef void RequestResponseInterceptor();
 
 /// 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;
 
-  @reflectable ServiceObject lastErrorOrException;
+  /// 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.
 
   void _initOnce() {
-    _registerPanes();
+    // Only called once.
+    assert(locationManager._app == null);
+    locationManager._app = this;
+    locationManager.init();
     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) {
-    lastErrorOrException = error;
-    _visit('error/');
+    response = error;
+    // No id, clear the hash.
+    locationManager.clearCurrentHash();
   }
 
   void _onException(ServiceException exception) {
-    lastErrorOrException = exception;
-    _visit('error/');
+    response = exception;
+    // No id, clear the hash.
+    locationManager.clearCurrentHash();
   }
 
-  void _visit(String url) {
-    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(),
+  ObservatoryApplication.devtools() :
+      locationManager = new LocationManager(),
       vm = new DartiumVM() {
     _initOnce();
   }
 
-  ObservatoryApplication(this.rootElement) :
-      locationManager = new HashLocationManager(),
-      vm = new HttpVM() {
+  ObservatoryApplication() :
+      locationManager = new LocationManager(),
+          vm = new WebSocketVM() {
     _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 11fb0a0..b541bf3 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -4,114 +4,50 @@
 
 part of app;
 
-abstract class LocationManager extends Observable {
-  final _initialPath = '/vm';
+/// 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';
+
   ObservatoryApplication _app;
+  @observable String currentHash = '';
 
-  String _lastUrl;
+  void init() {
+    window.onHashChange.listen((event) {
+      // Request the current anchor.
+      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;
+    if (window.location.hash == '') {
+      // Fresh start, load the vm page.
+      window.location.hash = defaultHash;
+    } else {
+      // The page is being reloaded.
+      requestCurrentHash();
     }
-    _go(url);
   }
 
-  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);
-    }
-    _app._visit(url);
+  /// Clear the current hash.
+  void clearCurrentHash() {
+    window.location.hash = '';
   }
 
-  /// 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.
+  /// Refresh the service object reference in the location entry.
+  void requestCurrentHash() {
+    currentHash = window.location.hash;
+    if (!currentHash.startsWith('#/')) {
       return;
     }
-    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}';
+    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');
     }
-    window.history.replaceState(initialPath, document.title, initialPath);
-    _go(window.location.hash);
+    _app.vm.get(currentHash.substring(2)).then((obj) {
+        _app.response = obj;
+        _app.args = args;
+      });
   }
-
-  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/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 558df19..564dad4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -8,9 +8,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ msg.isolate.relativeHashLink('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>
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 ae35925..0b595f6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <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>
+<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index 8f5dbc1..b55f8ae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -11,14 +11,14 @@
 
 @CustomTag('class-view')
 class ClassViewElement extends ObservatoryElement {
-  @published Class cls;
+  @published ServiceMap cls;
   ClassViewElement.created() : super.created();
 
   Future<ServiceObject> eval(String text) {
     return cls.isolate.get(
         cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
   }
-
+  
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
   Future<ServiceObject> retainedSize(String dummy) {
     return cls.isolate.get(cls.id + "/retained");
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 8ac2639..7548085 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -16,18 +16,17 @@
     <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.isAbstract }}">
+        <template if="{{ cls['abstract'] }}">
           abstract
         </template>
-        <template if="{{ cls.isPatch }}">
+        <template if="{{ cls['patch'] }}">
           patch
         </template>
         class {{ cls.name }}
@@ -36,32 +35,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.superClass != null }}">
+        <template if="{{ cls['super'] != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls.superClass }}"></class-ref>
+              <class-ref ref="{{ cls['super'] }}"></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>
@@ -70,11 +69,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>
@@ -95,19 +94,19 @@
       </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>
@@ -123,11 +122,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 }}">
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 14ba961..e14384c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -6,10 +6,10 @@
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
+          <a href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+          <a href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
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 db45db9..f04fd06 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -57,7 +57,6 @@
       <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 }}">
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 dd33743..ba54e66 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -7,7 +7,6 @@
     <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>
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 709ae9b9..6de1a19 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -17,7 +17,7 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
   <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 5464260..5673bbf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -19,9 +19,8 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
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 58c4460..cabdd91 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
@@ -9,9 +9,8 @@
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ flagList.isolate.relativeHashLink('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 0051e18..70e5e96 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -10,7 +10,7 @@
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 <script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index ccb44e7..eb5bf6b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -21,9 +21,8 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
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 4983fba..6688e5a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
@@ -92,13 +92,13 @@
 
   void _updateClassList(classList, int freeClassId) {
     for (var member in classList['members']) {
-      if (member is! Class) {
+      if (member['type'] != '@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 +148,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";
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 96cf469..9f5b556 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -22,9 +22,8 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('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>
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 fe5f2fc..aea9cd7 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -41,11 +41,10 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap 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">
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 b31dac0..943ccda 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -34,16 +34,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] != null}}">
-        <a on-click="{{ goto }}" href="{{ url }}">
+        <a 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 on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_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 on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
+        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
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 a9293cd..215d670 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -19,7 +19,6 @@
       <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 }}">
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 c1d5692..4343aec 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
@@ -10,7 +10,6 @@
     <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">
@@ -20,7 +19,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -28,7 +27,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
         </li>
       </ul>
 
@@ -36,7 +35,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
+          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
         </li>
       </ul>
 
@@ -44,7 +43,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
+          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -52,7 +51,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
+          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
         </li>
       </ul>
 
@@ -110,7 +109,7 @@
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -159,7 +158,7 @@
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -289,7 +288,7 @@
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -349,7 +348,7 @@
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -445,10 +444,10 @@
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+      <a href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
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 e1c522e..b15b9fc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -11,9 +11,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
-      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
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 883e556..84e4e66 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -1,8 +1,9 @@
+<head>
 <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 on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a 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 5aa8dd4..9ed1e77 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -145,33 +145,28 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            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>
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
           </div>
         </div>
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
         </template>
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 c55b1d1..582c9ee 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -92,10 +92,8 @@
     isolate.updateTagProfile().then((tagProfile) {
       tagProfileChart.update(tagProfile);
       _drawTagProfileChart();
-      if (_updateTimer != null) {
-        // Start the timer again.
-        _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
-      }
+      // Start the timer again.
+      _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
     });
   }
 
@@ -109,7 +107,6 @@
     super.leftView();
     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 5de18e6..794b50a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -28,7 +28,6 @@
       <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">
@@ -100,7 +99,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
+              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
             </div>
           </div>
         </div>
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 4319f09..5dbfc55 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -4,10 +4,10 @@
 <polymer-element name="library-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
   <template if="{{ nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    <a href="{{ url }}">unnamed</a>
   </template>
   <template if="{{ !nameIsEmpty }}">
-    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
 <script type="application/dart" src="library_ref.dart"></script>
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 6c30fd7..9b4e339 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -19,7 +19,6 @@
       <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">
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 fb241d4..c82b427 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -6,7 +6,6 @@
 
 import 'dart:html';
 import 'observatory_element.dart';
-import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
@@ -58,19 +57,6 @@
   }
 }
 
-@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;
@@ -91,7 +77,7 @@
   @reflectable
   String get hashLinkWorkaround {
     if (isolate != null) {
-      return isolate.link;
+      return isolate.hashLink;
     } 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 915b647..fd4f762 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -81,7 +81,7 @@
     </style>
 
     <li class="menu">
-      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+      <a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -129,7 +129,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
+    <li><a href="{{ link }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -165,31 +165,9 @@
   </template>
 </polymer-element>
 
-<polymer-element name="nav-control" extends="observatory-element">
-  <template>
-    <style>
-      .black {
-        color: #000;
-      }
-      li {
-        float: right;
-        margin: 0;
-      }
-      li button {
-        margin: 3px;
-        padding: 8px;
-      }
-    </style>
-    <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>
@@ -198,15 +176,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.relativeLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('profile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
                      anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -215,7 +193,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.link }}"
+    <nav-menu link="{{ library.hashLink }}"
               anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
@@ -224,7 +202,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.link }}"
+    <nav-menu link="{{ cls.hashLink }}"
               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 50c5edd..d1a4f8d 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,16 @@
 @CustomTag('observatory-application')
 class ObservatoryApplicationElement extends ObservatoryElement {
   @published bool devtools = false;
-  @reflectable ObservatoryApplication app;
+  @published ObservatoryApplication app;
 
   ObservatoryApplicationElement.created() : super.created();
 
   enteredView() {
     super.enteredView();
     if (devtools) {
-      app = new ObservatoryApplication.devtools(this);
+      app = new ObservatoryApplication.devtools();
     } else {
-      app = new ObservatoryApplication(this);
+      app = new ObservatoryApplication();
     }
   }
 }
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 d933140..0d34af3 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -1,8 +1,10 @@
 <head>
   <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_view.html">
+  <link rel="import" href="response_viewer.html">
 </head>
 <polymer-element name="observatory-application" extends="observatory-element">
-  <!-- This element explicitly manages its child elements -->
+  <template>
+    <response-viewer app="{{ this.app }}"></response-viewer>
+  </template>
   <script type="application/dart" src="observatory_application.dart"></script>
 </polymer-element>
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 55adba4..b889559 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -4,7 +4,6 @@
 
 library observatory_element;
 
-import 'dart:html';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
@@ -25,14 +24,6 @@
     super.ready();
   }
 
-  void goto(MouseEvent event, var detail, Element target) {
-    location.onGoto(event, detail, target);
-  }
-
-  String gotoLink(String url) {
-    return location.makeLink(url);
-  }
-
   void attributeChanged(String name, var oldValue, var newValue) {
     super.attributeChanged(name, oldValue, newValue);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
new file mode 100644
index 0000000..a541b35
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.dart
@@ -0,0 +1,15 @@
+// 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 response_viewer_element;
+
+import 'observatory_element.dart';
+import 'package:observatory/app.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('response-viewer')
+class ResponseViewerElement extends ObservatoryElement {
+  @published ObservatoryApplication app;
+  ResponseViewerElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
new file mode 100644
index 0000000..230120a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
@@ -0,0 +1,10 @@
+<head>
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="service_view.html">
+</head>
+<polymer-element name="response-viewer" extends="observatory-element">
+  <template>
+    <service-view object="{{ app.response }}"></service-view>
+  </template>
+  <script type="application/dart" src="response_viewer.dart"></script>
+</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
index 63825a8..07f27f2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -5,7 +5,7 @@
 <polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="css/shared.css">
-  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 <script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index 07cd6dc..accb51f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -17,8 +17,8 @@
       </li>
     </nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    <nav-control></nav-control>
+    <nav-refresh callback="{{ refresh }}">
+    </nav-refresh>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
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 eee6a16..95e7972 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -7,7 +7,6 @@
     <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>
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 f54a5e1..855417e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -7,7 +7,6 @@
     <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>
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 5b6b1a1..2286b1a 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 gotoLink(ref.link);
+    return ref.hashLink;
   }
 
   String get serviceId {
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 1b66ce7..bd3e569 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -9,9 +9,8 @@
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeHashLink('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">
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 711d20b..07155df 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
-  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 <script type="application/dart" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
index d54e35c..226d085 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -15,7 +15,6 @@
     <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">
@@ -40,7 +39,7 @@
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
+            See <a href="#/flags">flags</a>
           </div>
         </div>
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 967907c..7df9eb6 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -29,6 +29,11 @@
   /// 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;
@@ -62,9 +67,6 @@
     var obj = null;
     assert(type != 'VM');
     switch (type) {
-      case 'Class':
-        obj = new Class._empty(owner);
-        break;
       case 'Code':
         obj = new Code._empty(owner);
         break;
@@ -250,7 +252,14 @@
   }
 
   Future<ServiceObject> get(String id) {
-    assert(id.startsWith('/') == false);
+    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('#'));
     // Isolates are handled specially, since they can cache sub-objects.
     if (id.startsWith(_isolatesPrefix)) {
       String isolateId = _parseIsolateId(id);
@@ -274,15 +283,14 @@
     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) {
@@ -490,7 +498,8 @@
   @reflectable Isolate get isolate => this;
   @observable ObservableMap counters = new ObservableMap();
 
-  String get link => '/${_id}';
+  String get link => _id;
+  String get hashLink => '#/$_id';
 
   @observable ServiceMap pauseEvent = null;
   bool get _isPaused => pauseEvent != null;
@@ -508,7 +517,9 @@
   }
 
   /// Creates a link to [id] relative to [this].
-  @reflectable String relativeLink(String id) => '/${this.id}/$id';
+  @reflectable String relativeLink(String id) => '${this.id}/$id';
+  /// Creates a relative link to [id] with a '#/' prefix.
+  @reflectable String relativeHashLink(String id) => '#/${relativeLink(id)}';
 
   static const TAG_ROOT_ID = 'code/tag-0';
 
@@ -574,41 +585,6 @@
     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;
@@ -643,9 +619,6 @@
       });
   }
 
-  @observable Class objectClass;
-  @observable final rootClasses = new ObservableList<Class>();
-
   @observable Library rootLib;
   @observable ObservableList<Library> libraries =
       new ObservableList<Library>();
@@ -933,7 +906,7 @@
   @observable String url;
   @reflectable final imports = new ObservableList<Library>();
   @reflectable final scripts = new ObservableList<Script>();
-  @reflectable final classes = new ObservableList<Class>();
+  @reflectable final classes = new ObservableList<ServiceMap>();
   @reflectable final variables = new ObservableList<ServiceMap>();
   @reflectable final functions = new ObservableList<ServiceMap>();
 
@@ -972,91 +945,6 @@
   }
 }
 
-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;
-
-  @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'];
-  }
-
-  void _addToChildren(Class cls) {
-    if (children.contains(cls)) {
-      return;
-    }
-    children.add(cls);
-  }
-}
-
 class ScriptLine {
   @reflectable final int line;
   @reflectable final String text;
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index 2ec4e85..e54d95c 100644
--- a/runtime/bin/vmservice/client/pubspec.yaml
+++ b/runtime/bin/vmservice/client/pubspec.yaml
@@ -1,7 +1,7 @@
 name: observatory
 version: 0.2.1
 dependencies:
-  polymer: '>= 0.10.0'
+  polymer: '>= 0.10.0-pre.13'
 transformers:
 - polymer:
     entry_points: 
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 4d2587a..da4cb4d 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -80,7 +80,7 @@
 
 class Server {
   static const WEBSOCKET_PATH = '/ws';
-  String observatoryPath = '/index.html';
+  String defaultPath = '/index.html';
   final String ip;
   int port;
 
@@ -89,48 +89,14 @@
 
   Server(this.service, this.ip, this.port);
 
-  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 with 'observatory' header.
+    // Allow cross origin requests.
     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 == '/' ? observatoryPath : request.uri.path;
-
-    if (path == WEBSOCKET_PATH) {
-      WebSocketTransformer.upgrade(request).then((WebSocket webSocket) {
-        new WebSocketClient(webSocket, service);
-      });
-      return;
-    }
+          request.uri.path == '/' ? defaultPath : request.uri.path;
 
     var resource = Resource.resources[path];
-    if (resource == null && _shouldServeObservatory(request)) {
-      resource = Resource.resources[observatoryPath];
-      assert(resource != null);
-    }
     if (resource != null) {
       // Serving up a static resource (e.g. .css, .html, .png).
       request.response.headers.contentType =
@@ -139,6 +105,14 @@
       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);
     client.onMessage(null, message);
diff --git a/runtime/lib/identical.cc b/runtime/lib/identical.cc
index abecb92..dac63b5 100644
--- a/runtime/lib/identical.cc
+++ b/runtime/lib/identical.cc
@@ -4,67 +4,14 @@
 
 #include "vm/bootstrap_natives.h"
 
-#include "vm/code_patcher.h"
-#include "vm/exceptions.h"
 #include "vm/object.h"
-#include "vm/stack_frame.h"
 
 namespace dart {
 
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
-
-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 unoptimized static call. Optimization was prevented.
-  ICData& ic_data = ICData::Handle();
-  CodePatcher::GetUnoptimizedStaticCallAt(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);
-  }
-}
-
-
 DEFINE_NATIVE_ENTRY(Identical_comparison, 2) {
   GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1));
-  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)) {
-          JSWarning("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)) {
-            JSWarning("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) {
-            JSWarning("integral double value and integer value that are equal "
-                      "are also identical");
-          }
-        }
-      }
-    }
-  }
-  return Bool::Get(is_identical).raw();
+  return Bool::Get(a.IsIdenticalTo(b)).raw();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 13bb7a9..b1206cd 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,8 +4,7 @@
 
 // VM-specific implementation of the dart:mirrors library.
 
-import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
-import "dart:_internal" show LRUMap;
+import "dart:collection";
 
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new UnmodifiableMapView({});
@@ -299,15 +298,21 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  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);
+  // 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 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;
@@ -326,7 +331,12 @@
         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));
@@ -345,6 +355,9 @@
   _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;
@@ -363,7 +376,12 @@
         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/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 62ca719..b88bad2 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -19,10 +19,6 @@
 [ $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 ]
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index 16bcf48..d0338a4 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1646,12 +1646,12 @@
 }
 
 
-void Assembler::LoadClassId(Register result, Register object, Condition cond) {
+void Assembler::LoadClassId(Register result, Register object) {
   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), cond);
+  ldrh(result, FieldAddress(object, class_id_offset));
 }
 
 
@@ -1685,14 +1685,6 @@
 }
 
 
-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 4469027..127b1f8 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -636,11 +636,10 @@
                                 const Address& dest,
                                 const Object& value);
 
-  void LoadClassId(Register result, Register object, Condition cond = AL);
+  void LoadClassId(Register result, Register object);
   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 c6d4457..0b3ddf1 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1073,19 +1073,6 @@
 }
 
 
-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 670f50c..f6f01d0 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -684,9 +684,6 @@
   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) {
@@ -1173,7 +1170,6 @@
   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 6c36ecf..f219e8e 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2656,19 +2656,6 @@
 }
 
 
-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 6688eca..f502bd5 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -686,8 +686,6 @@
 
   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 af16a32..f4a4f6e 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -652,19 +652,6 @@
 }
 
 
-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 a4428c6..efbb467 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1183,7 +1183,6 @@
   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.
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 1887af0..c04809e 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -8,7 +8,6 @@
 #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"
@@ -2817,69 +2816,37 @@
 }
 
 
-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));
-  }
+// 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
+};
 
-  // 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);
-  }
-}
+// XMM0 is used only as a scratch register in the optimized code. No need to
+// save it.
+static const intptr_t kNumberOfVolatileXmmRegisters =
+    kNumberOfXmmRegisters - 1;
 
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   EnterFrame(0);
 
-  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
-  PushRegisters(CallingConventions::kVolatileCpuRegisters,
-                CallingConventions::kVolatileXmmRegisters);
+  // 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;
+  }
 
   ReserveAlignedFrameSpace(frame_space);
 }
@@ -2889,41 +2856,30 @@
   // 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 =
-      kPushedCpuRegistersCount * kWordSize +
-      kPushedXmmRegistersCount * kFpuRegisterSize;
+      kNumberOfVolatileCpuRegisters * kWordSize +
+      kNumberOfVolatileXmmRegisters * kFpuRegisterSize;
   leaq(RSP, Address(RBP, -kPushedRegistersSize));
 
-  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
-  PopRegisters(CallingConventions::kVolatileCpuRegisters,
-               CallingConventions::kVolatileXmmRegisters);
+  // 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]);
+  }
 
   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);
@@ -3322,19 +3278,6 @@
 }
 
 
-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 5a141fd..70f345e 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -714,9 +714,6 @@
     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);
@@ -729,11 +726,6 @@
 
   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.
    */
@@ -745,8 +737,6 @@
 
   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 341196a..de4275f 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(CallingConventions::kArg1Reg);
+  __ pushq(RDI);  // First argument is passed in register rdi.
   __ 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(CallingConventions::kArg1Reg, RAX);
+  __ movl(RDI, RAX);
   __ call(&call2);
   __ addq(RSP, Immediate(space));
   __ ret();
@@ -2724,11 +2724,10 @@
   __ pushq(PP);  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ pushq(CTX);
-  __ movq(CTX, CallingConventions::kArg1Reg);
-  __ StoreIntoObject(CallingConventions::kArg3Reg,
-                     FieldAddress(CallingConventions::kArg3Reg,
-                                  GrowableObjectArray::data_offset()),
-                     CallingConventions::kArg2Reg);
+  __ movq(CTX, RDI);
+  __ StoreIntoObject(RDX,
+                     FieldAddress(RDX, GrowableObjectArray::data_offset()),
+                     RSI);
   __ popq(CTX);
   __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
@@ -2809,7 +2808,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) {
-  __ pushq(CallingConventions::kArg1Reg);
+  __ pushq(RDI);
   __ fildl(Address(RSP, 0));
   __ fstpl(Address(RSP, 0));
   __ movsd(XMM0, Address(RSP, 0));
@@ -2897,11 +2896,10 @@
 
 
 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
-  __ pushq(RSI);
-  __ pushq(RDI);
-  __ pushq(CallingConventions::kArg1Reg);  // from.
-  __ pushq(CallingConventions::kArg2Reg);  // to.
-  __ pushq(CallingConventions::kArg3Reg);  // count.
+  // Save incoming arguments.
+  __ pushq(RDI);  // Arg0, from.
+  __ pushq(RSI);  // Arg1, to.
+  __ pushq(RDX);  // Arg2, count.
   __ movq(RSI, Address(RSP, 2 * kWordSize));  // from.
   __ movq(RDI, Address(RSP, 1 * kWordSize));  // to.
   __ movq(RCX, Address(RSP, 0 * kWordSize));  // count.
@@ -2910,8 +2908,6 @@
   __ popq(RAX);
   __ popq(RAX);
   __ popq(RAX);
-  __ popq(RDI);
-  __ popq(RSI);
   __ ret();
 }
 
@@ -2930,9 +2926,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
-  __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
+  // RDI: Arg0.
+  // RSI: Arg1.
   __ 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/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 9bdb976..cd2bd36 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -57,17 +57,33 @@
 // Measure creation of core isolate from a snapshot.
 //
 BENCHMARK(CorelibIsolateStartup) {
-  const int kNumIterations = 1000;
-  Timer timer(true, "CorelibIsolateStartup");
-  Isolate* isolate = Isolate::Current();
+  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();
   for (int i = 0; i < kNumIterations; i++) {
-    timer.Start();
-    TestCase::CreateTestIsolate();
-    timer.Stop();
+    Dart_Isolate new_isolate =
+        Dart_CreateIsolate(NULL, NULL, buffer, NULL, &err);
+    EXPECT(new_isolate != NULL);
     Dart_ShutdownIsolate();
   }
-  benchmark->set_score(timer.TotalElapsedTime() / kNumIterations);
-  Isolate::SetCurrent(isolate);
+  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);
 }
 
 
diff --git a/runtime/vm/bigint_operations.cc b/runtime/vm/bigint_operations.cc
index 0c18476..9d8a2a4 100644
--- a/runtime/vm/bigint_operations.cc
+++ b/runtime/vm/bigint_operations.cc
@@ -487,57 +487,13 @@
 }
 
 
-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 = Uint64ToDouble(AbsToUint64(bigint));
+    double absolute_value = static_cast<double>(AbsToUint64(bigint));
     double result = bigint.IsNegative() ? -absolute_value : absolute_value;
     return Double::New(result);
   }
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index f61d414..72706ac 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -32,10 +32,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, 30000,
+DEFINE_FLAG(int, optimization_counter_threshold, 15000,
     "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, 4000,
+DEFINE_FLAG(int, reoptimization_counter_threshold, 2000,
     "Counter threshold before a function gets reoptimized.");
 DEFINE_FLAG(bool, stop_on_excessive_deoptimization, false,
     "Debugging: stops program if deoptimizing same function too often");
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index 9ecc06c..7aca73d 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -52,7 +52,8 @@
 // The patch code buffer contains the jmp code which will be inserted at
 // entry point.
 void CodePatcher::PatchEntry(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
+  const uword patch_addr = code.GetPcForDeoptId(Isolate::kNoDeoptId,
+                                                PcDescriptors::kEntryPatch);
   ASSERT(patch_addr != 0);
   JumpPattern jmp_entry(patch_addr, code);
   ASSERT(!jmp_entry.IsValid());
@@ -76,7 +77,8 @@
 // The entry point is a jmp instruction, the patch code buffer contains
 // original code, the entry point contains the jump instruction.
 void CodePatcher::RestoreEntry(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
+  const uword patch_addr = code.GetPcForDeoptId(Isolate::kNoDeoptId,
+                                                PcDescriptors::kEntryPatch);
   ASSERT(patch_addr != 0);
   JumpPattern jmp_entry(patch_addr, code);
   ASSERT(jmp_entry.IsValid());
@@ -100,7 +102,8 @@
 
 
 bool CodePatcher::IsEntryPatched(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
+  const uword patch_addr = code.GetPcForDeoptId(Isolate::kNoDeoptId,
+                                                PcDescriptors::kEntryPatch);
   if (patch_addr == 0) {
     return false;
   }
@@ -110,8 +113,9 @@
 
 
 bool CodePatcher::CodeIsPatchable(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
-  // Zero means means that the function is not patchable.
+  const uword patch_addr = code.GetPcForDeoptId(Isolate::kNoDeoptId,
+                                                PcDescriptors::kEntryPatch);
+  // kEntryPatch may not exist which means the function is not patchable.
   if (patch_addr == 0) {
     return false;
   }
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 7874083..f5e76ef 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -138,62 +138,6 @@
   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/dart.cc b/runtime/vm/dart.cc
index ab5826d..66e9601 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -107,7 +107,6 @@
   CodeObservers::InitOnce();
   ThreadInterrupter::InitOnce();
   Profiler::InitOnce();
-  SemiSpace::InitOnce();
 
 #if defined(USING_SIMULATOR)
   Simulator::InitOnce();
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 3fd2558..40fdf74 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("xyz");
+  Dart_Handle xyz = NewString("abc");
   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("xyz");
+  Dart_Handle xyz = NewString("abc");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 374ccb4..c0eff97 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -109,7 +109,7 @@
   NestedStatement* outer_;
 
   JoinEntryInstr* break_target_;
-  const intptr_t try_index_;
+  intptr_t try_index_;
 };
 
 
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 4c240e8..3a6c97e 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -103,10 +103,7 @@
           Library::Handle(Library::CoreLibrary()).
               LookupClass(Symbols::List()))),
       parallel_move_resolver_(this),
-      pending_deoptimization_env_(NULL),
-      entry_patch_pc_offset_(Code::kInvalidPc),
-      patch_code_pc_offset_(Code::kInvalidPc),
-      lazy_deopt_pc_offset_(Code::kInvalidPc) {
+      pending_deoptimization_env_(NULL) {
   ASSERT(assembler != NULL);
   ASSERT(!list_class_.IsNull());
 }
@@ -703,9 +700,6 @@
       pc_descriptors_list_->FinalizePcDescriptors(code.EntryPoint()));
   if (!is_optimizing_) descriptors.Verify(parsed_function_.function());
   code.set_pc_descriptors(descriptors);
-  code.set_entry_patch_pc_offset(entry_patch_pc_offset_);
-  code.set_patch_code_pc_offset(patch_code_pc_offset_);
-  code.set_lazy_deopt_pc_offset(lazy_deopt_pc_offset_);
 }
 
 
@@ -888,32 +882,16 @@
                                            const Function& function,
                                            intptr_t argument_count,
                                            const Array& argument_names,
-                                           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);
+                                           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);
   } else {
-    ICData& call_ic_data = ICData::ZoneHandle(ic_data.raw());
-    if (call_ic_data.IsNull()) {
-      call_ic_data = ICData::New(parsed_function().function(),  // Caller fun.
-                                 String::Handle(function.name()),
-                                 arguments_descriptor,
-                                 deopt_id,
-                                 0);  // No arguments checked.
-      call_ic_data.AddTarget(function);
-    }
-    EmitUnoptimizedStaticCall(argument_count, deopt_id, token_pos, locs,
-                              call_ic_data);
+    EmitUnoptimizedStaticCall(function, arguments_descriptor, argument_count,
+                              deopt_id, token_pos, locs);
   }
 }
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 1d9a443..6950ce3 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -331,8 +331,7 @@
                           const Function& function,
                           intptr_t argument_count,
                           const Array& argument_names,
-                          LocationSummary* locs,
-                          const ICData& ic_data);
+                          LocationSummary* locs);
 
   void GenerateNumberTypeCheck(Register kClassIdReg,
                                const AbstractType& type,
@@ -476,11 +475,12 @@
                                intptr_t token_pos,
                                LocationSummary* locs);
 
-  void EmitUnoptimizedStaticCall(intptr_t argument_count,
+  void EmitUnoptimizedStaticCall(const Function& function,
+                                 const Array& arguments_descriptor,
+                                 intptr_t argument_count,
                                  intptr_t deopt_id,
                                  intptr_t token_pos,
-                                 LocationSummary* locs,
-                                 const ICData& ic_data);
+                                 LocationSummary* locs);
 
   // Type checking helper methods.
   void CheckClassIds(Register class_id_reg,
@@ -594,10 +594,6 @@
   // In future AddDeoptStub should be moved out of the instruction template.
   Environment* pending_deoptimization_env_;
 
-  intptr_t entry_patch_pc_offset_;
-  intptr_t patch_code_pc_offset_;
-  intptr_t lazy_deopt_pc_offset_;
-
   DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
 };
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index d22fc67..542ac99 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -973,8 +973,9 @@
     __ mov(PP, Operand(R7));
 
     // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
     intptr_t threshold = FLAG_optimization_counter_threshold;
     __ ldr(R7, FieldAddress(function_reg,
                             Function::usage_counter_offset()));
@@ -991,7 +992,9 @@
     ASSERT(function_reg == R6);
     __ Branch(&StubCode::OptimizeFunctionLabel(), GE);
   } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1094,13 +1097,14 @@
   GenerateDeferredCode();
   // Emit function patching code. This will be swapped with the first 3
   // instructions at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kPatchCode,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   __ BranchPatchable(&StubCode::FixCallersTargetLabel());
-
-  if (is_optimizing()) {
-    lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Branch(&StubCode::DeoptimizeLazyLabel());
-  }
+  AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
+  __ Branch(&StubCode::DeoptimizeLazyLabel());
 }
 
 
@@ -1232,10 +1236,19 @@
   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);
-  __ LoadTaggedClassIdMayBeSmi(R0, R0);
+  __ 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);
 
   // 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()));
@@ -1281,11 +1294,27 @@
 
 
 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,
-    const ICData& ic_data) {
+    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);
   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 66a29de..c4ac888 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) {
-    __ brk(0);
+    __ hlt(0);
   }
 
   ASSERT(deopt_env() != NULL);
@@ -664,7 +664,7 @@
                         3,
                         locs);
     // We should never return here.
-    __ brk(0);
+    __ hlt(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.
-    __ brk(0);
+    __ hlt(0);
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
   }
@@ -970,8 +970,9 @@
     __ LoadObject(function_reg, function, new_pp);
 
     // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
     intptr_t threshold = FLAG_optimization_counter_threshold;
     __ LoadFieldFromOffset(
         R7, function_reg, Function::usage_counter_offset(), new_pp);
@@ -998,7 +999,9 @@
     // Set up pool pointer in new_pp.
     __ LoadPoolPointer(new_pp);
 
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1073,7 +1076,7 @@
         __ LeaveDartFrame();  // The arguments are still on the stack.
         __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
-        __ brk(0);
+        __ hlt(0);
       } else {
         __ Stop("Wrong number of arguments");
       }
@@ -1097,18 +1100,19 @@
 
   VisitBlocks();
 
-  __ brk(0);
+  __ hlt(0);
   GenerateDeferredCode();
-
   // Emit function patching code. This will be swapped with the first 3
   // instructions at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kPatchCode,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   __ BranchPatchable(&StubCode::FixCallersTargetLabel());
 
-  if (is_optimizing()) {
-    lazy_deopt_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   __ BranchPatchable(&StubCode::DeoptimizeLazyLabel());
-  }
 }
 
 
@@ -1238,10 +1242,19 @@
   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);
-  __ LoadTaggedClassIdMayBeSmi(R0, R0);
+  __ 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);
 
   // 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);
@@ -1287,11 +1300,27 @@
 
 
 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,
-    const ICData& ic_data) {
+    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);
   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 1c4bfd3..b58ded0 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -987,10 +987,10 @@
       (!is_optimizing() || may_reoptimize())) {
     const Register function_reg = EDI;
     __ LoadObject(function_reg, function);
-
     // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
@@ -1004,7 +1004,9 @@
     ASSERT(function_reg == EDI);
     __ j(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel());
   } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1104,13 +1106,14 @@
   GenerateDeferredCode();
   // Emit function patching code. This will be swapped with the first 5 bytes
   // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kPatchCode,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   __ jmp(&StubCode::FixCallersTargetLabel());
-
-  if (is_optimizing()) {
-    lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ jmp(&StubCode::DeoptimizeLazyLabel());
-  }
+  AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
+  __ jmp(&StubCode::DeoptimizeLazyLabel());
 }
 
 
@@ -1169,11 +1172,27 @@
 
 
 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,
-    const ICData& ic_data) {
+    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);
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1263,9 +1282,16 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label load_cache;
+  Label not_smi, load_cache;
   __ movl(EAX, Address(ESP, (argument_count - 1) * kWordSize));
-  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+  __ 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);
 
   // 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 0a69efa..68538fe 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1002,8 +1002,9 @@
     __ mov(PP, T1);
 
     // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
     intptr_t threshold = FLAG_optimization_counter_threshold;
     __ lw(T1, FieldAddress(function_reg, Function::usage_counter_offset()));
     if (is_optimizing()) {
@@ -1025,7 +1026,9 @@
     __ Bind(&dont_branch);
 
   } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1130,13 +1133,14 @@
   GenerateDeferredCode();
   // Emit function patching code. This will be swapped with the first 5 bytes
   // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kPatchCode,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   __ BranchPatchable(&StubCode::FixCallersTargetLabel());
-
-  if (is_optimizing()) {
-    lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Branch(&StubCode::DeoptimizeLazyLabel());
-  }
+  AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
+  __ Branch(&StubCode::DeoptimizeLazyLabel());
 }
 
 
@@ -1272,11 +1276,20 @@
   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));
-  __ LoadTaggedClassIdMayBeSmi(T0, T0);
+  __ 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);
 
   // 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()));
@@ -1323,11 +1336,27 @@
 
 
 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,
-    const ICData& ic_data) {
+    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);
   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 0f5a1e5..be3a6b0 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1000,8 +1000,9 @@
     __ LoadObject(function_reg, function, new_pp);
 
     // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
@@ -1041,8 +1042,9 @@
 
     // Load callee's pool pointer.
     __ movq(new_pp, Address(new_pc, -object_pool_pc_dist - offset));
-
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    AddCurrentDescriptor(PcDescriptors::kEntryPatch,
+                         Isolate::kNoDeoptId,
+                         0);  // No token position.
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1140,15 +1142,17 @@
   GenerateDeferredCode();
   // Emit function patching code. This will be swapped with the first 13 bytes
   // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
+  AddCurrentDescriptor(PcDescriptors::kPatchCode,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
   // This is patched up to a point in FrameEntry where the PP for the
   // current function is in R13 instead of PP.
   __ JmpPatchable(&StubCode::FixCallersTargetLabel(), R13);
 
-  if (is_optimizing()) {
-    lazy_deopt_pc_offset_ = assembler()->CodeSize();
-    __ Jmp(&StubCode::DeoptimizeLazyLabel(), PP);
-  }
+  AddCurrentDescriptor(PcDescriptors::kLazyDeoptJump,
+                       Isolate::kNoDeoptId,
+                       0);  // No token position.
+  __ Jmp(&StubCode::DeoptimizeLazyLabel(), PP);
 }
 
 
@@ -1207,11 +1211,27 @@
 
 
 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,
-    const ICData& ic_data) {
+    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);
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1301,10 +1321,19 @@
   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));
-  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+  __ 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);
 
   // 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()));
@@ -1432,15 +1461,58 @@
 // This function must be in sync with FlowGraphCompiler::RecordSafepoint and
 // FlowGraphCompiler::SlowPathEnvironmentFor.
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
-  // TODO(vegorov): avoid saving non-volatile registers.
-  __ PushRegisters(locs->live_registers()->cpu_registers(),
-                   locs->live_registers()->fpu_registers());
+  // 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);
+    }
+  }
 }
 
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
-  __ PopRegisters(locs->live_registers()->cpu_registers(),
-                  locs->live_registers()->fpu_registers());
+  // 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);
+  }
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 5283cea..ea4f0ba 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -34,6 +34,7 @@
 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),
@@ -2336,26 +2337,6 @@
 
 
 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ICData& call_ic_data = ICData::ZoneHandle(ic_data()->raw());
-  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 = ICData::New(compiler->parsed_function().function(),
-                               String::Handle(function().name()),
-                               arguments_descriptor,
-                               deopt_id(),
-                               num_args_checked);  // No arguments checked.
-    call_ic_data.AddTarget(function());
-  }
   if (!compiler->is_optimizing()) {
     // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
     // and therefore need a deoptimization descriptor.
@@ -2368,8 +2349,7 @@
                                function(),
                                ArgumentCount(),
                                argument_names(),
-                               locs(),
-                               call_ic_data);
+                               locs());
 }
 
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index b8c98bd..5be62b3 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -437,16 +437,18 @@
                          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) {
-    __ LoadClassId(value_cid_reg, value_reg, NE);
+    __ b(&done, EQ);
   } else {
     __ b(value_is_smi, EQ);
-    __ LoadClassId(value_cid_reg, value_reg);
   }
+  __ LoadClassId(value_cid_reg, value_reg);
+  __ Bind(&done);
 }
 
 
@@ -924,11 +926,8 @@
   // 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() || is_leaf_call) {
+  if (is_bootstrap_native()) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -947,7 +946,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry);
-  __ LoadImmediate(R1, argc_tag);
+  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()));
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -1021,8 +1020,7 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -1057,7 +1055,15 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, object);
+  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);
 }
 
 
@@ -5113,7 +5119,7 @@
   ASSERT(result != value_obj);
   __ LoadDFromOffset(DTMP, value_obj, Double::value_offset() - kHeapObjectTag);
 
-  Label done, do_call;
+  Label do_call, done;
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM because vcvtid gives 0 for NaN.
   __ vcmpd(DTMP, DTMP);
@@ -5126,9 +5132,9 @@
 
   // Check for overflow and that it fits into Smi.
   __ CompareImmediate(result, 0xC0000000);
-  __ SmiTag(result, PL);
-  __ b(&done, PL);
-
+  __ b(&do_call, MI);
+  __ SmiTag(result);
+  __ b(&done);
   __ Bind(&do_call);
   __ Push(value_obj);
   ASSERT(instance_call()->HasICData());
@@ -5142,8 +5148,7 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   __ Bind(&done);
 }
 
@@ -5575,8 +5580,7 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs(),
-                                 ICData::Handle());
+                                 locs());
     return;
   }
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index da4e8b8..1e1ae77 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -92,7 +92,7 @@
   __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist, PP);
   __ b(&stack_ok, EQ);
-  __ brk(0);
+  __ hlt(0);
   __ Bind(&stack_ok);
 #endif
   __ LeaveDartFrame();
@@ -348,7 +348,7 @@
                                 1,
                                 locs);
   // We should never return here.
-  __ brk(0);
+  __ hlt(0);
   __ Bind(&done);
 }
 
@@ -769,11 +769,8 @@
   // 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() || is_leaf_call) {
+  if (is_bootstrap_native()) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -792,7 +789,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry, PP);
-  __ LoadImmediate(R1, argc_tag, PP);
+  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -869,8 +866,7 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -905,7 +901,15 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, 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);
 }
 
 
@@ -4501,8 +4505,7 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   __ Bind(&done);
 }
 
@@ -4884,8 +4887,7 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs(),
-                                 ICData::Handle());
+                                 locs());
     return;
   }
 
@@ -5121,7 +5123,7 @@
                                 kThrowRuntimeEntry,
                                 1,
                                 locs());
-  __ brk(0);
+  __ hlt(0);
 }
 
 
@@ -5138,7 +5140,7 @@
                                 kReThrowRuntimeEntry,
                                 2,
                                 locs());
-  __ brk(0);
+  __ hlt(0);
 }
 
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index fbf3eba..e25e90e 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -796,9 +796,6 @@
   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());
@@ -810,10 +807,10 @@
     __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
   }
   __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function())));
-  __ movl(EDX, Immediate(argc_tag));
-  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
-      &StubCode::CallBootstrapCFunctionLabel() :
-      &StubCode::CallNativeCFunctionLabel();
+  __ movl(EDX, Immediate(NativeArguments::ComputeArgcTag(function())));
+  const ExternalLabel* stub_entry =
+      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
+                                &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -907,8 +904,7 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   ASSERT(locs()->out(0).reg() == EAX);
 }
 
@@ -943,7 +939,15 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, object);
+  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);
 }
 
 
@@ -3329,7 +3333,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(
@@ -4946,9 +4950,8 @@
                                instance_call()->token_pos(),
                                target,
                                kNumberOfArguments,
-                               Object::null_array(),  // No argument names.
-                               locs(),
-                               ICData::Handle());
+                               Object::null_array(),  // No argument names.,
+                               locs());
   __ Bind(&done);
 }
 
@@ -5424,8 +5427,7 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs(),
-                                 ICData::Handle());
+                                 locs());
     return;
   }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 92b090d..b8ba0c0 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -879,11 +879,8 @@
   // 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() || is_leaf_call) {
+  if (is_bootstrap_native()) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -902,7 +899,7 @@
 #endif
   }
   __ LoadImmediate(T5, entry);
-  __ LoadImmediate(A1, argc_tag);
+  __ LoadImmediate(A1, NativeArguments::ComputeArgcTag(function()));
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -987,8 +984,7 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   ASSERT(locs()->out(0).reg() == V0);
 }
 
@@ -1023,7 +1019,15 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, 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);
 }
 
 
@@ -3861,8 +3865,7 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   __ Bind(&done);
 }
 
@@ -4238,8 +4241,7 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs(),
-                                 ICData::Handle());
+                                 locs());
     return;
   }
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 0a82178..90aeed8 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -723,9 +723,6 @@
   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);
@@ -740,10 +737,10 @@
   __ LoadImmediate(
       RBX, Immediate(reinterpret_cast<uword>(native_c_function())), PP);
   __ LoadImmediate(
-      R10, Immediate(argc_tag), PP);
-  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
-      &StubCode::CallBootstrapCFunctionLabel() :
-      &StubCode::CallNativeCFunctionLabel();
+      R10, Immediate(NativeArguments::ComputeArgcTag(function())), PP);
+  const ExternalLabel* stub_entry =
+      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
+                                &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -836,8 +833,7 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs(),
-                               ICData::Handle());
+                               locs());
   ASSERT(locs()->out(0).reg() == RAX);
 }
 
@@ -872,7 +868,15 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ LoadTaggedClassIdMayBeSmi(result, 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);
 }
 
 
@@ -4792,8 +4796,7 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs(),
-                               ICData::Handle());
+                               locs());
   __ Bind(&done);
 }
 
@@ -4805,7 +4808,7 @@
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
-  result->set_out(0, Location::RequiresRegister());
+  result->set_out(0, Location:: Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
   return result;
 }
@@ -5326,8 +5329,7 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs(),
-                                 ICData::Handle());
+                                 locs());
     return;
   }
 
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 11ac497..b0dd01c 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -949,8 +949,9 @@
   __ b(&fall_through, NE);
   // Receiver is Mint, return false if right is Smi.
   __ tst(R0, Operand(kSmiTagMask));
-  __ LoadObject(R0, Bool::False(), EQ);
-  __ bx(LR, EQ);
+  __ b(&fall_through, NE);
+  __ LoadObject(R0, Bool::False());
+  __ Ret();
   // TODO(srdjan): Implement Mint == Mint comparison.
 
   __ Bind(&fall_through);
@@ -1227,8 +1228,9 @@
     // Overflow is signaled with minint.
     // Check for overflow and that it fits into Smi.
     __ CompareImmediate(R0, 0xC0000000);
-    __ SmiTag(R0, PL);
-    __ bx(LR, PL);
+    __ b(&fall_through, MI);
+    __ SmiTag(R0);
+    __ Ret();
     __ Bind(&fall_through);
   }
 }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 91ed897..7a617a3 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -472,20 +472,17 @@
   }
 
   bool ContainsRegister(Register reg) const {
-    return Contains(cpu_registers_, reg);
+    return (cpu_registers_ & (1 << reg)) != 0;
   }
 
   bool ContainsFpuRegister(FpuRegister fpu_reg) const {
-    return Contains(fpu_registers_, fpu_reg);
+    return (fpu_registers_ & (1 << fpu_reg)) != 0;
   }
 
   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 eaa5221..25ef768 100644
--- a/runtime/vm/memory_region.h
+++ b/runtime/vm/memory_region.h
@@ -6,7 +6,6 @@
 #define VM_MEMORY_REGION_H_
 
 #include "platform/assert.h"
-#include "vm/allocation.h"
 #include "vm/globals.h"
 
 namespace dart {
@@ -14,16 +13,10 @@
 // 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 : public ValueObject {
+class MemoryRegion {
  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_; }
@@ -75,6 +68,8 @@
 
   void* pointer_;
   uword size_;
+
+  DISALLOW_COPY_AND_ASSIGN(MemoryRegion);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3d3da05..2f9559b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2523,13 +2523,6 @@
         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);
-        }
       }
     }
   }
@@ -10136,6 +10129,9 @@
 const char* PcDescriptors::KindAsStr(intptr_t index) const {
   switch (DescriptorKind(index)) {
     case PcDescriptors::kDeopt:           return "deopt        ";
+    case PcDescriptors::kEntryPatch:      return "entry-patch  ";
+    case PcDescriptors::kPatchCode:       return "patch        ";
+    case PcDescriptors::kLazyDeoptJump:   return "lazy-deopt   ";
     case PcDescriptors::kIcCall:          return "ic-call      ";
     case PcDescriptors::kOptStaticCall:   return "opt-call     ";
     case PcDescriptors::kUnoptStaticCall: return "unopt-call   ";
@@ -11622,9 +11618,6 @@
     result.set_is_alive(false);
     result.set_comments(Comments::New(0));
     result.set_compile_timestamp(0);
-    result.set_entry_patch_pc_offset(kInvalidPc);
-    result.set_patch_code_pc_offset(kInvalidPc);
-    result.set_lazy_deopt_pc_offset(kInvalidPc);
     result.set_pc_descriptors(Object::empty_descriptors());
   }
   return result.raw();
@@ -11904,21 +11897,15 @@
 }
 
 
-uword Code::GetEntryPatchPc() const {
-  return (entry_patch_pc_offset() != kInvalidPc)
-      ? EntryPoint() + entry_patch_pc_offset() : 0;
-}
-
-
 uword Code::GetPatchCodePc() const {
-  return (patch_code_pc_offset() != kInvalidPc)
-      ? EntryPoint() + patch_code_pc_offset() : 0;
+  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
+  return descriptors.GetPcForKind(PcDescriptors::kPatchCode);
 }
 
 
 uword Code::GetLazyDeoptPc() const {
-  return (lazy_deopt_pc_offset() != kInvalidPc)
-      ? EntryPoint() + lazy_deopt_pc_offset() : 0;
+  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
+  return descriptors.GetPcForKind(PcDescriptors::kLazyDeoptJump);
 }
 
 
@@ -16005,23 +15992,6 @@
 }
 
 
-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) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 508e650..6c7182e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2970,6 +2970,9 @@
  public:
   enum Kind {
     kDeopt,            // Deoptimization continuation point.
+    kEntryPatch,       // Location where to patch entry.
+    kPatchCode,        // Buffer for patching code entry.
+    kLazyDeoptJump,    // Lazy deoptimization trampoline.
     kIcCall,           // IC call.
     kOptStaticCall,    // Call directly to known target, e.g. static call.
     kUnoptStaticCall,  // Call to a known target via a stub.
@@ -3650,17 +3653,10 @@
   }
   intptr_t GetTokenIndexOfPC(uword pc) const;
 
-  enum {
-    kInvalidPc = -1
-  };
-
-  // Returns 0 if code is not patchable
-  uword GetEntryPatchPc() const;
+  // Find pc, return 0 if not found.
   uword GetPatchCodePc() const;
-
   uword GetLazyDeoptPc() const;
 
-  // Find pc, return 0 if not found.
   uword GetPcForDeoptId(intptr_t deopt_id, PcDescriptors::Kind kind) const;
   intptr_t GetDeoptIdForOsr(uword pc) const;
 
@@ -3684,29 +3680,6 @@
     return raw_ptr()->compile_timestamp_;
   }
 
-  intptr_t entry_patch_pc_offset() const {
-    return raw_ptr()->entry_patch_pc_offset_;
-  }
-  void set_entry_patch_pc_offset(intptr_t pc) const {
-    raw_ptr()->entry_patch_pc_offset_ = pc;
-  }
-
-
-  intptr_t patch_code_pc_offset() const {
-    return raw_ptr()->patch_code_pc_offset_;
-  }
-  void set_patch_code_pc_offset(intptr_t pc) const {
-    raw_ptr()->patch_code_pc_offset_ = pc;
-  }
-
-
-  intptr_t lazy_deopt_pc_offset() const {
-    return raw_ptr()->lazy_deopt_pc_offset_;
-  }
-  void set_lazy_deopt_pc_offset(intptr_t pc) const {
-    raw_ptr()->lazy_deopt_pc_offset_ = pc;
-  }
-
  private:
   void set_state_bits(intptr_t bits) const;
 
@@ -5304,8 +5277,6 @@
 
   int32_t CharAt(intptr_t index) const;
 
-  Scanner::CharAtFunc CharAtFunc() const;
-
   intptr_t CharSize() const;
 
   inline bool Equals(const String& str) const;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 8826973..8667c20 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -42,7 +42,6 @@
 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;
@@ -2542,15 +2541,8 @@
     // TODO(hausner): Remove this limitation if the language spec indeed
     // allows optional parameters.
     if (func.HasOptionalParameters()) {
-      const Class& super_class = Class::Handle(I, current_class().SuperClass());
       ErrorMsg(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());
+               "forwarding constructors must not have optional parameters");
     }
 
     // Prepare user-defined arguments to be forwarded to super call.
@@ -8386,17 +8378,13 @@
   } 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 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(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.
+    ASSERT(num_arguments == 2);
+    return new(isolate()) ComparisonNode(ident_pos,
+                                         Token::kEQ_STRICT,
+                                         arguments->NodeAt(0),
+                                         arguments->NodeAt(1));
   }
   return new(isolate()) StaticCallNode(call_pos, func, arguments);
 }
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 2545385..4cb4e10 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -21,8 +21,7 @@
 namespace dart {
 
 
-#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID) || \
-    defined(HOST_ARCH_ARM64)
+#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID)
   DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
 #else
   DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler");
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9b6a897..523151b 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -840,13 +840,6 @@
   // architectures.
   intptr_t state_bits_;  // state, is_optimized, is_alive.
 
-  // PC offsets for code patching.
-  intptr_t entry_patch_pc_offset_;
-  intptr_t patch_code_pc_offset_;
-  intptr_t lazy_deopt_pc_offset_;
-
-  intptr_t dummy_alignment_;
-
   // Variable length data follows here.
   int32_t data_[0];
 
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 6ce93de..fcf228e 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -40,18 +40,10 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(entry);
-    // 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);
+    // Cache the stack pointer in a callee-saved register.
     __ 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 8688684..0e78100 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());
-    __ CallCFunction(&label);
+    __ call(&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 b6ccaee..c207415 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -19,34 +19,6 @@
 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];
 
@@ -68,7 +40,11 @@
   c0_ = '\0';
   newline_seen_ = false;
   prev_token_line_ = 1;
-  saved_context_ = NULL;
+  while (saved_context_ != NULL) {
+    ScanContext* ctx = saved_context_;
+    saved_context_ = ctx->next;
+    delete ctx;
+  }
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
   brace_level_ = 0;
@@ -82,19 +58,22 @@
     : source_(src),
       source_length_(src.Length()),
       saved_context_(NULL),
-      private_key_(String::ZoneHandle(private_key.raw())),
-      char_at_func_(src.CharAtFunc()),
-      isolate_(Isolate::Current()) {
+      private_key_(String::ZoneHandle(private_key.raw())) {
   Reset();
 }
 
-
-Scanner::~Scanner() {}
+Scanner::~Scanner() {
+  while (saved_context_ != NULL) {
+    ScanContext* ctx = saved_context_;
+    saved_context_ = ctx->next;
+    delete ctx;
+  }
+}
 
 
 void Scanner::ErrorMsg(const char* msg) {
   current_token_.kind = Token::kERROR;
-  current_token_.literal = &String::ZoneHandle(I, Symbols::New(msg));
+  current_token_.literal = &String::ZoneHandle(Symbols::New(msg));
   current_token_.position = c0_pos_;
   token_start_ = lookahead_pos_;
   current_token_.offset = lookahead_pos_;
@@ -102,8 +81,12 @@
 
 
 void Scanner::PushContext() {
-  ScanContext* ctx = new(I) ScanContext(this);
+  ScanContext* ctx = new ScanContext;
+  ctx->next = saved_context_;
   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.
@@ -115,9 +98,12 @@
   ASSERT(brace_level_ == 0);
   ASSERT(string_delimiter_ == '\0');
   ScanContext* ctx = saved_context_;
-  ctx->CopyTo(this);
-  saved_context_ = ctx->next();
+  saved_context_ = ctx->next;
+  string_delimiter_ = ctx->string_delimiter;
   ASSERT(string_delimiter_ != '\0');
+  string_is_multiline_ = ctx->string_is_multiline;
+  brace_level_ = ctx->brace_level;
+  delete ctx;
 }
 
 
@@ -168,11 +154,11 @@
   if (!str.IsOneByteString()) {
     return false;
   }
-  if (str.Length() == 0 || !IsIdentStartChar(CallCharAt()(str, 0))) {
+  if (str.Length() == 0 || !IsIdentStartChar(str.CharAt(0))) {
     return false;
   }
   for (int i =  1; i < str.Length(); i++) {
-    if (!IsIdentChar(CallCharAt()(str, i))) {
+    if (!IsIdentChar(str.CharAt(i))) {
       return false;
     }
   }
@@ -216,7 +202,7 @@
       newline_seen_ = true;
       c0_pos_.line++;
       c0_pos_.column = 0;
-      if (CallCharAt()(source_, lookahead_pos_) == '\r') {
+      if (source_.CharAt(lookahead_pos_) == '\r') {
         // Replace a sequence of '\r' '\n' with a single '\n'.
         if (LookaheadChar(1) == '\n') {
           lookahead_pos_++;
@@ -241,7 +227,7 @@
   ASSERT(how_many >= 0);
   int32_t lookahead_char = '\0';
   if (lookahead_pos_ + how_many < source_length_) {
-    lookahead_char = CallCharAt()(source_, lookahead_pos_ + how_many);
+    lookahead_char = source_.CharAt(lookahead_pos_ + how_many);
   }
   return lookahead_char;
 }
@@ -296,7 +282,7 @@
   ASSERT(allow_dollar || (c0_ != '$'));
   int ident_length = 0;
   int ident_pos = lookahead_pos_;
-  int32_t ident_char0 = CallCharAt()(source_, ident_pos);
+  int32_t ident_char0 = source_.CharAt(ident_pos);
   while (IsIdentChar(c0_) && (allow_dollar || (c0_ != '$'))) {
     ReadChar();
     ident_length++;
@@ -306,14 +292,13 @@
   // 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] ==
-                   CallCharAt()(source_, ident_pos + char_pos))) {
+               (keyword[char_pos] == source_.CharAt(ident_pos + char_pos))) {
           char_pos++;
         }
         if (char_pos == ident_length) {
@@ -329,7 +314,7 @@
   // We did not read a keyword.
   current_token_.kind = Token::kIDENT;
   String& literal =
-      String::ZoneHandle(I, Symbols::New(source_, ident_pos, ident_length));
+      String::ZoneHandle(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_);
@@ -387,7 +372,7 @@
   }
   if (current_token_.kind != Token::kILLEGAL) {
     intptr_t len = lookahead_pos_ - token_start_;
-    String& str = String::ZoneHandle(I,
+    String& str = String::ZoneHandle(
         String::SubString(source_, token_start_, len, Heap::kOld));
     str = Symbols::New(str);
     current_token_.literal = &str;
@@ -542,7 +527,7 @@
       // Scanned a string piece.
       ASSERT(string_chars.data() != NULL);
       // Strings are canonicalized: Allocate a symbol.
-      current_token_.literal = &String::ZoneHandle(I,
+      current_token_.literal = &String::ZoneHandle(
           Symbols::FromUTF32(string_chars.data(), string_chars.length()));
       // Preserve error tokens.
       if (current_token_.kind != Token::kERROR) {
@@ -565,7 +550,7 @@
           Recognize(Token::kSTRING);
           ASSERT(string_chars.data() != NULL);
           // Strings are canonicalized: Allocate a symbol.
-          current_token_.literal = &String::ZoneHandle(I,
+          current_token_.literal = &String::ZoneHandle(
               Symbols::FromUTF32(string_chars.data(), string_chars.length()));
         }
         EndStringLiteral();
@@ -930,7 +915,7 @@
 
 
 const Scanner::GrowableTokenStream& Scanner::GetStream() {
-  GrowableTokenStream* ts = new(I) GrowableTokenStream(128);
+  GrowableTokenStream* ts = new GrowableTokenStream(128);
   ScanAll(ts);
   if (FLAG_print_tokens) {
     Scanner::PrintTokens(*ts);
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 5dde147..92c2919 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -18,7 +18,6 @@
 class Array;
 class Library;
 class RawString;
-class ScanContext;
 class String;
 
 // A call to Scan() scans the source one token at at time.
@@ -26,8 +25,6 @@
 // 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 {
@@ -78,7 +75,7 @@
   static void InitOnce();
 
   // Return true if str is an identifier.
-  bool IsIdent(const String& str);
+  static 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.
@@ -88,10 +85,15 @@
                              const String** value);
 
  private:
-  friend class ScanContext;
-
   static const int kNumLowercaseChars = 26;
 
+  struct ScanContext {
+    ScanContext* next;
+    char string_delimiter;
+    bool string_is_multiline;
+    int  brace_level;
+  };
+
   struct KeywordTable {
     Token::Kind kind;
     const char* keyword_chars;
@@ -180,10 +182,6 @@
 
   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.
@@ -209,10 +207,6 @@
 
   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 1dc911c..fa8d753 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -14,7 +14,6 @@
 #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"
@@ -286,8 +285,7 @@
 // StoreBuffers.
 class VerifyStoreBufferPointerVisitor : public ObjectPointerVisitor {
  public:
-  VerifyStoreBufferPointerVisitor(Isolate* isolate,
-                                  const SemiSpace* to)
+  VerifyStoreBufferPointerVisitor(Isolate* isolate, MemoryRegion* to)
       : ObjectPointerVisitor(isolate), to_(to) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
@@ -300,87 +298,12 @@
   }
 
  private:
-  const SemiSpace* to_;
+  MemoryRegion* 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());
-#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) {
-  {
-    MutexLocker locker(mutex_);
-    if (cache_ != NULL && cache_->size() == size) {
-      SemiSpace* result = cache_;
-      cache_ = NULL;
-      return result;
-    }
-  }
-  if (size == 0) {
-    return new SemiSpace(NULL);
-  } else {
-    VirtualMemory* reserved = VirtualMemory::Reserve(size);
-    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);
-#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,
                      uword object_alignment)
@@ -394,12 +317,31 @@
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
 
-  const intptr_t semi_space_size = (max_capacity_in_words / 2) * kWordSize;
-  to_ = SemiSpace::New(semi_space_size);
-  if (to_ == NULL) {
-    FATAL("Out of memory.\n");
+  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);
   }
-  from_ = NULL;
+
+  // Make sure that the two semi-spaces are aligned properly.
+  ASSERT(Utils::IsAligned(to_->start(), kObjectAlignment));
+  ASSERT(Utils::IsAligned(from_->start(), kObjectAlignment));
 
   // Setup local fields.
   top_ = FirstObjectStart();
@@ -407,13 +349,18 @@
   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() {
-  ASSERT(!scavenging_);
-  ASSERT(from_ == NULL);
-  to_->Delete();
+  delete to_;
+  delete from_;
+  delete space_;
 }
 
 
@@ -423,13 +370,9 @@
   }
   // Flip the two semi-spaces so that to_ is always the space for allocating
   // objects.
+  MemoryRegion* temp = from_;
   from_ = to_;
-  to_ = SemiSpace::New(from_->size());
-  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");
-  }
+  to_ = temp;
   top_ = FirstObjectStart();
   resolved_top_ = top_;
   end_ = to_->end();
@@ -456,9 +399,9 @@
 #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())();
   }
@@ -796,9 +739,10 @@
 
 
 void Scavenger::WriteProtect(bool read_only) {
-  ASSERT(!scavenging_);
-  ASSERT(from_ == NULL);
-  to_->WriteProtect(read_only);
+  if (space_ != NULL) {
+    space_->Protect(
+        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+  }
 }
 
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 367fbc2..4c9fecc 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -25,42 +25,6 @@
 
 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);
-
-  // 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() const { return static_cast<intptr_t>(region_.size()); }
-  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_;
-};
-
-
 class Scavenger {
  public:
   Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment);
@@ -74,7 +38,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_ == NULL || !from_->Contains(addr));
+    ASSERT(!from_->Contains(addr));
     return to_->Contains(addr);
   }
 
@@ -219,8 +183,9 @@
 
   void ProcessWeakTables();
 
-  SemiSpace* from_;
-  SemiSpace* to_;
+  VirtualMemory* space_;
+  MemoryRegion* to_;
+  MemoryRegion* from_;
 
   Heap* heap_;
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index b4fcc5a..c8deea9 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();
@@ -341,7 +341,8 @@
                                 DeserializeState state) {
   intptr_t index = (id - kMaxPredefinedObjectIds);
   ASSERT(index == backward_references_.length());
-  BackRefNode node(obj, state);
+  BackRefNode* node = new BackRefNode(obj, state);
+  ASSERT(node != NULL);
   backward_references_.Add(node);
 }
 
@@ -350,7 +351,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;
 }
@@ -373,9 +374,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);
     }
   }
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index caf9c85..0038bce 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -293,7 +293,7 @@
   RawStacktrace* NewStacktrace();
 
  private:
-  class BackRefNode : public ValueObject {
+  class BackRefNode : public ZoneAllocated {
    public:
     BackRefNode(Object* reference, DeserializeState state)
         : reference_(reference), state_(state) {}
@@ -301,15 +301,11 @@
     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.
@@ -349,7 +345,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;
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index 125735d..d85e8ec 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,15 +45,9 @@
 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 c9fa08a..4f1c8c3 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -216,6 +216,12 @@
   __ 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)
@@ -227,6 +233,13 @@
 #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);
@@ -1270,7 +1283,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;
+  Label loop, update, test, found, get_class_id_as_smi;
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
   // R6: ic_data_array with check entries: classes and target functions.
@@ -1282,7 +1295,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.
-  __ LoadTaggedClassIdMayBeSmi(R0, R0);
+  __ bl(&get_class_id_as_smi);
   // R7: argument_count - 1 (smi).
   // R0: receiver's class ID (smi).
   __ ldr(R1, Address(R6, 0));  // First class id (smi) to check.
@@ -1294,7 +1307,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));
-      __ LoadTaggedClassIdMayBeSmi(R0, R0);
+      __ bl(&get_class_id_as_smi);
       // R0: next argument class ID (smi).
       __ LoadFromOffset(kWord, R1, R6, i * kWordSize);
       // R1: next class ID to check (smi).
@@ -1312,7 +1325,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));
-    __ LoadTaggedClassIdMayBeSmi(R0, R0);
+    __ bl(&get_class_id_as_smi);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1372,6 +1385,17 @@
   __ 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 538cc2c..ef20898 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -229,6 +229,12 @@
   __ 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)
@@ -240,7 +246,13 @@
 #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);
@@ -1375,7 +1387,23 @@
 
   // R0 <- [SP + (R7 << 3)]
   __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
-  __ LoadTaggedClassIdMayBeSmi(R0, R0);
+
+  {
+    // 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);
+  }
 
   // R7: argument_count - 1 (untagged).
   // R0: receiver's class ID (smi).
@@ -1389,7 +1417,20 @@
       __ AddImmediate(R0, R7, -i, kNoPP);
       // R0 <- [SP + (R0 << 3)]
       __ ldr(R0, Address(SP, R0, UXTX, Address::Scaled));
-      __ LoadTaggedClassIdMayBeSmi(R0, R0);
+      {
+        // 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);
+      }
       // R0: next argument class ID (smi).
       __ LoadFromOffset(R1, R6, i * kWordSize, kNoPP);
       // R1: next class ID to check (smi).
@@ -1406,7 +1447,20 @@
   // 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));
-    __ LoadTaggedClassIdMayBeSmi(R0, R0);
+    {
+      // 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);
+    }
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1528,8 +1582,7 @@
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  GenerateNArgsCheckInlineCacheStub(
-      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
+  __ Stop("GenerateClosureCallInlineCacheStub");
 }
 
 
@@ -1776,23 +1829,8 @@
 }
 
 
-// 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) {
-  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.
+  __ Stop("GenerateJumpToExceptionHandlerStub");
 }
 
 
@@ -1813,7 +1851,7 @@
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ LeaveStubFrame();
   __ br(R0);
-  __ brk(0);
+  __ hlt(0);
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 8815879..8c1e3b9 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -226,8 +226,17 @@
   __ 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()),
@@ -1312,7 +1321,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;
+  Label loop, update, test, found, get_class_id_as_smi;
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
   // EBX: ic_data_array with check entries: classes and target functions.
@@ -1323,8 +1332,7 @@
   // 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.
-  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
-
+  __ call(&get_class_id_as_smi);
   // EAX: receiver's class ID (smi).
   __ movl(EDI, Address(EBX, 0));  // First class id (smi) to check.
   __ jmp(&test);
@@ -1335,8 +1343,7 @@
       // 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));
-      __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
-
+      __ call(&get_class_id_as_smi);
       // EAX: next argument class ID (smi).
       __ movl(EDI, Address(EBX, i * kWordSize));
       // EDI: next class ID to check (smi).
@@ -1354,7 +1361,7 @@
   if (num_args > 1) {
     __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
     __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
-    __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+    __ call(&get_class_id_as_smi);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1411,7 +1418,20 @@
   __ movl(EBX, FieldAddress(EAX, Function::instructions_offset()));
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(EBX);
-  __ int3();
+
+  // 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();
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 154aadb..604045a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -229,6 +229,11 @@
   __ 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.
@@ -243,6 +248,19 @@
   __ 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);
@@ -1427,7 +1445,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;
+  Label loop, update, test, found, get_class_id_as_smi;
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
   // T0: ic_data_array with check entries: classes and target functions.
@@ -1441,9 +1459,8 @@
   __ subu(T1, T1, TMP);
   __ sll(T3, T1, 1);  // T1 (argument_count - 1) is smi.
   __ addu(T3, T3, SP);
-  __ lw(T3, Address(T3));
-  __ LoadTaggedClassIdMayBeSmi(T3, T3);
-
+  __ bal(&get_class_id_as_smi);
+  __ delay_slot()->lw(T3, Address(T3));
   // T1: argument_count - 1 (smi).
   // T3: receiver's class ID (smi).
   __ b(&test);
@@ -1457,8 +1474,8 @@
       __ addu(T3, T1, T3);
       __ sll(T3, T3, 1);
       __ addu(T3, SP, T3);
-      __ lw(T3, Address(T3));
-      __ LoadTaggedClassIdMayBeSmi(T3, T3);
+      __ bal(&get_class_id_as_smi);
+      __ delay_slot()->lw(T3, Address(T3));
       // T3: next argument class ID (smi).
       __ lw(T4, Address(T0, i * kWordSize));
       // T4: next class ID to check (smi).
@@ -1479,8 +1496,8 @@
   if (num_args > 1) {
     __ sll(T3, T1, 1);
     __ addu(T3, T3, SP);
-    __ lw(T3, Address(T3));
-    __ LoadTaggedClassIdMayBeSmi(T3, T3);
+    __ bal(&get_class_id_as_smi);
+    __ delay_slot()->lw(T3, Address(T3));
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1555,6 +1572,20 @@
   __ 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 08bf475..cafb218 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -88,11 +88,7 @@
   __ 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.
-#if defined(_WIN64)
-  ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
-  __ movq(CallingConventions::kArg1Reg, RSP);
-#endif
-  __ CallCFunction(RBX);
+  __ call(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -130,9 +126,6 @@
 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();
@@ -199,12 +192,19 @@
   __ 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.
 
-  // Pass the pointer to the NativeArguments.
-  __ movq(CallingConventions::kArg1Reg, RSP);
-  // Pass pointer to function entrypoint.
-  __ movq(CallingConventions::kArg2Reg, RBX);
-  __ CallCFunction(&NativeEntry::NativeCallWrapperLabel());
+  // 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);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -288,10 +288,8 @@
   __ 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.
-
-  // Pass the pointer to the NativeArguments.
-  __ movq(CallingConventions::kArg1Reg, RSP);
-  __ CallCFunction(RBX);
+  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
+  __ call(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -440,9 +438,8 @@
     offset += kFpuRegisterSize;
   }
 
-  // Pass address of saved registers block.
-  __ movq(CallingConventions::kArg1Reg, RSP);
-  __ ReserveAlignedFrameSpace(0);  // Ensure stack is aligned before the call.
+  __ movq(RDI, RSP);  // Pass address of saved registers block.
+  __ ReserveAlignedFrameSpace(0);
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (RAX) is stack-size (FP - SP) in bytes.
 
@@ -469,8 +466,7 @@
     __ pushq(RBX);  // Preserve result as first local.
   }
   __ ReserveAlignedFrameSpace(0);
-  // Pass last FP as a parameter.
-  __ movq(CallingConventions::kArg1Reg, RBP);
+  __ movq(RDI, RBP);  // Pass last FP as parameter in RDI.
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into RBX.
@@ -689,11 +685,6 @@
   // 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) |
@@ -701,13 +692,16 @@
   const intptr_t kInitialOffset = 1;
   // Save arguments descriptor array and new context.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
-  __ pushq(kArgDescReg);
+  __ pushq(RSI);
   const intptr_t kNewContextOffset = -(kInitialOffset + 1) * kWordSize;
-  __ pushq(kNewContextReg);
+  __ pushq(RCX);
 
   // Save C++ ABI callee-saved registers.
-  __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                   CallingConventions::kCalleeSaveXmmRegisters);
+  __ pushq(RBX);
+  __ pushq(R12);
+  __ pushq(R13);
+  __ pushq(R14);
+  __ pushq(R15);
 
   // 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
@@ -725,50 +719,28 @@
   // compiled or runtime stub code.
 
   // Cache the new Context pointer into CTX while executing Dart code.
-  __ movq(CTX, Address(kNewContextReg, VMHandles::kOffsetOfRawPtrInHandle));
-
-  const Register kIsolateReg = RBX;
+  __ movq(CTX, Address(RCX, VMHandles::kOffsetOfRawPtrInHandle));
 
   // Load Isolate pointer from Context structure into R8.
-  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
 
   // Save the current VMTag on the stack.
-  __ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset()));
+  ASSERT(kSavedVMTagSlotFromEntryFp == -8);
+  __ movq(RAX, Address(R8, 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(kIsolateReg, Isolate::vm_tag_offset()),
+  __ movq(Address(R8, Isolate::vm_tag_offset()),
           Immediate(VMTag::kScriptTagId));
 
   // Save the top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  __ movq(RAX, Address(kIsolateReg, Isolate::top_exit_frame_info_offset()));
+  ASSERT(kExitLinkSlotFromEntryFp == -9);
+  __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
-#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));
+  __ movq(Address(R8, 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
@@ -777,31 +749,19 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  __ movq(RAX, Address(kIsolateReg, Isolate::top_context_offset()));
+  ASSERT(kSavedContextSlotFromEntryFp == -10);
+  __ movq(RAX, Address(R8, 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(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
-
-  // Push arguments. At this point we only need to preserve kEntryPointReg.
-  ASSERT(kEntryPointReg != RDX);
+  __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle));
 
   // 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(kArgsReg, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(RDX, Address(RDX, VMHandles::kOffsetOfRawPtrInHandle));
   __ leaq(RDX, FieldAddress(RDX, Array::data_offset()));
 
   // Set up arguments for the Dart call.
@@ -811,45 +771,51 @@
   __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
   __ movq(RAX, Immediate(0));
   __ Bind(&push_arguments);
-  __ pushq(Address(RDX, RAX, TIMES_8, 0));
+  __ movq(RCX, Address(RDX, RAX, TIMES_8, 0));  // RDX is start of arguments.
+  __ pushq(RCX);
   __ incq(RAX);
   __ cmpq(RAX, RBX);
   __ j(LESS, &push_arguments, Assembler::kNearJump);
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ call(kEntryPointReg);  // R10 is the arguments descriptor array.
+  __ call(RDI);  // R10 is the arguments descriptor array.
 
-  // Restore CTX from the saved context handle.
+  // Read the saved new Context pointer.
   __ 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(kArgDescReg, Address(RBP, kArgumentsDescOffset));
-  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(RSI, Address(RBP, kArgumentsDescOffset));
+  __ movq(R10, Address(RSI, 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(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(CTX, FieldAddress(CTX, Context::isolate_offset()));
 
   // Restore the saved Context pointer into the Isolate structure.
-  __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::top_context_offset()), RDX);
+  // Uses RCX as a temporary register for this.
+  __ popq(RCX);
+  __ movq(Address(CTX, Isolate::top_context_offset()), RCX);
 
   // Restore the saved top exit frame info back into the Isolate structure.
+  // Uses RDX as a temporary register for this.
   __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()), RDX);
+  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
 
   // Restore the current VMTag from the stack.
   __ popq(RDX);
-  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()), RDX);
+  __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
 
   // Restore C++ ABI callee-saved registers.
-  __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
-                  CallingConventions::kCalleeSaveXmmRegisters);
+  __ popq(R15);
+  __ popq(R14);
+  __ popq(R13);
+  __ popq(R12);
+  __ popq(RBX);
 
   // Restore the frame pointer.
   __ LeaveFrame();
@@ -1039,8 +1005,7 @@
   __ Bind(&L);
   // Setup frame, push callee-saved registers.
   __ EnterCallRuntimeFrame(0);
-  __ movq(CallingConventions::kArg1Reg,
-          FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(RDI, FieldAddress(CTX, Context::isolate_offset()));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -1283,7 +1248,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;
+  Label loop, update, test, found, get_class_id_as_smi;
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
   // R12: ic_data_array with check entries: classes and target functions.
@@ -1294,7 +1259,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.
-  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+  __ call(&get_class_id_as_smi);
   // RAX: receiver's class ID as smi.
   __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
   __ jmp(&test);
@@ -1305,7 +1270,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));
-      __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+      __ call(&get_class_id_as_smi);
       // RAX: next argument class ID (smi).
       __ movq(R13, Address(R12, i * kWordSize));
       // R13: next class ID to check (smi).
@@ -1323,7 +1288,7 @@
   if (num_args > 1) {
     __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
     __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));
-    __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
+    __ call(&get_class_id_as_smi);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1378,6 +1343,19 @@
   __ 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();
 }
 
 
@@ -1702,30 +1680,20 @@
 
 // Jump to the exception or error handler.
 // TOS + 0: return address
-// Arg1: program counter
-// Arg2: stack pointer
-// Arg3: frame_pointer
-// Arg4: exception object
-// Arg5: stacktrace object
+// RDI: program counter
+// RSI: stack pointer
+// RDX: frame_pointer
+// RCX: exception object
+// R8: stacktrace object
 // No Result.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == RAX);
   ASSERT(kStackTraceObjectReg == RDX);
-  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.
+  __ 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.
 }
 
 
@@ -1801,8 +1769,8 @@
   __ j(NOT_EQUAL, &done, Assembler::kNearJump);
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
-  __ movq(CallingConventions::kArg1Reg, left);
-  __ movq(CallingConventions::kArg2Reg, right);
+  __ movq(RDI, left);
+  __ movq(RSI, 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 56b56fc..f1c43b1 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(CallingConventions::kArg1Reg, smi1, PP);
-  __ LoadObject(CallingConventions::kArg2Reg, smi2, PP);
+  __ LoadObject(RDI, smi1, PP);  // Set up argument 1 smi1.
+  __ LoadObject(RSI, smi2, PP);  // Set up argument 2 smi2.
   __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ leave();
   __ ret();  // Return value is in RAX.
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index ef9223f..b39c188 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 = static_cast<uintptr_t>(context.Rip);
-      state->fp = static_cast<uintptr_t>(context.Rbp);
-      state->sp = static_cast<uintptr_t>(context.Rsp);
+      state->pc = reinterpret_cast<uintptr_t>(context.Rip);
+      state->fp = reinterpret_cast<uintptr_t>(context.Rbp);
+      state->sp = reinterpret_cast<uintptr_t>(context.Rsp);
 #else
       UNIMPLEMENTED();
 #endif
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index d71ba6f..b1939b7 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -404,8 +404,7 @@
         new DartString.literal(node.slowNameString))];
     }
     return makeConstructedConstant(
-        node, type, compiler.symbolConstructor, createArguments,
-        isLiteralSymbol: true);
+        node, type, compiler.symbolConstructor, createArguments);
   }
 
   Constant makeTypeConstant(DartType elementType) {
@@ -740,8 +739,7 @@
 
   Constant makeConstructedConstant(
       Spannable node, InterfaceType type, ConstructorElement constructor,
-      List<Constant> getArguments(ConstructorElement constructor),
-      {bool isLiteralSymbol: false}) {
+      List<Constant> getArguments(ConstructorElement constructor)) {
     // 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);
@@ -760,8 +758,7 @@
     evaluator.evaluateConstructorFieldValues(arguments);
     List<Constant> jsNewArguments = evaluator.buildJsNewArguments(classElement);
 
-    return new ConstructedConstant(constructedType, jsNewArguments,
-        isLiteralSymbol: isLiteralSymbol);
+    return new ConstructedConstant(constructedType, jsNewArguments);
   }
 
   Constant visitParenthesizedExpression(ParenthesizedExpression node) {
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 65d8e38..d0b9d14 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -586,8 +586,7 @@
   final List<Constant> fields;
   final int hashCode;
 
-  ConstructedConstant(DartType type, List<Constant> fields,
-      {this.isLiteralSymbol: false})
+  ConstructedConstant(DartType type, List<Constant> fields)
     : this.fields = fields,
       hashCode = computeHash(type, fields),
       super(type) {
@@ -595,9 +594,6 @@
   }
   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;
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 8d6dda8..8738ec6 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -326,16 +326,6 @@
                ..dartType = exp.type;
   }
 
-  Expression visitInvokeConstConstructor(tree.InvokeConstConstructor exp) {
-    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,
-                       isConst: true)
-               ..constructor = constructor
-               ..dartType = exp.type;
-  }
-
   Expression visitConcatenateStrings(tree.ConcatenateStrings exp) {
     List args = exp.arguments.map(visitExpression).toList(growable:false);
     return new StringConcat(args);
@@ -376,9 +366,6 @@
     } else if (type is TypeVariableType) {
       return new TypeAnnotation(type.name)
           ..dartType = type;
-    } else if (type is DynamicType) {
-      return new TypeAnnotation("dynamic")
-          ..dartType = type;
     } else {
       throw "Unsupported type annotation: $type";
     }
@@ -409,13 +396,8 @@
       }
       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 {
-        throw "Unsupported constant: $constant";
-      }
+      throw "Unsupported constant: $constant";
     }
   }
 }
+
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 6067fa8..6f71f08 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -195,19 +195,6 @@
   accept(Visitor visitor) => visitor.visitLiteralMap(this);
 }
 
-class InvokeConstConstructor extends Expression implements Invoke {
-  final GenericType type;
-  final FunctionElement target;
-  final List<Expression> arguments;
-  final Selector selector;
-
-  ClassElement get targetClass => target.enclosingElement;
-
-  InvokeConstConstructor(this.type, this.target, this.selector, this.arguments);
-
-  accept(Visitor visitor) => visitor.visitInvokeConstConstructor(this);
-}
-
 /// A conditional expression.
 class Conditional extends Expression {
   Expression condition;
@@ -396,7 +383,6 @@
   E visitNot(Not node);
   E visitLiteralList(LiteralList node);
   E visitLiteralMap(LiteralMap node);
-  E visitInvokeConstConstructor(InvokeConstConstructor node);
 
   S visitStatement(Statement s) => s.accept(this);
   S visitLabeledStatement(LabeledStatement node);
@@ -660,11 +646,6 @@
     return new If(condition, thenStatement, elseStatement);
   }
 
-  Expression visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
-    return new InvokeConstConstructor(node.type, node.constructor, node.selector,
-        translateArguments(node.arguments));
-  }
-
   Expression visitConstant(ir.Constant node) {
     return new Constant(node.value);
   }
@@ -867,13 +848,6 @@
     return node;
   }
 
-  Expression visitInvokeConstConstructor(InvokeConstConstructor node) {
-    for (int i = node.arguments.length - 1; i >= 0; --i) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
-    return node;
-  }
-
   Expression visitConcatenateStrings(ConcatenateStrings node) {
     for (int i = node.arguments.length - 1; i >= 0; --i) {
       node.arguments[i] = visitExpression(node.arguments[i]);
@@ -1447,11 +1421,6 @@
     return node;
   }
 
-  Expression visitInvokeConstConstructor(InvokeConstConstructor node) {
-    _rewriteList(node.arguments);
-    return node;
-  }
-
   Expression visitLogicalOperator(LogicalOperator node) {
     node.left = makeCondition(node.left, true);
     node.right = makeCondition(node.right, true);
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 134a8bd..79b3a84 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -53,7 +53,6 @@
   visitConcatenateStrings(ConcatenateStrings node) {}
   visitLiteralList(LiteralList node) {}
   visitLiteralMap(LiteralMap node) {}
-  visitInvokeConstConstructor(InvokeConstConstructor node) {}
   visitConstant(Constant node) {}
   visitConditional(Conditional node) {}
   visitLogicalOperator(LogicalOperator node) {}
@@ -210,10 +209,6 @@
     printStatement(null, expr(node));
   }
 
-  visitInvokeConstConstructor(InvokeConstConstructor node) {
-    printStatement(null, expr(node));
-  }
-
   visitConditional(Conditional node) {
     printStatement(null, expr(node));
   }
@@ -326,17 +321,6 @@
     return "map [${entries.join(', ')}]";
   }
 
-  String visitInvokeConstConstructor(InvokeConstConstructor node) {
-    String callName;
-    if (node.target.name.isEmpty) {
-      callName = '${node.type}';
-    } else {
-      callName = '${node.type}.${node.target.name}';
-    }
-    String arguments = node.arguments.map(visitExpression).join(', ');
-    return "const $callName($arguments)";
-  }
-
   String visitConstant(Constant node) {
     return "${node.value}";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index d4224c2..984df98 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -811,12 +811,8 @@
     return result;
   }
 
-  ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) {
-    assert(isOpen);
-    ir.Constant constant = new ir.Constant(getConstantForNode(node));
-    add(new ir.LetPrim(constant));
-    return constant;
-  }
+  // TODO(kmillikin): other literals.
+  //   LiteralSymbol
 
   ir.Primitive visitParenthesizedExpression(
       ast.ParenthesizedExpression node) {
@@ -1082,110 +1078,59 @@
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
-    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);
-        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();
-
-        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);
-        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();
-      }
-      if (!Elements.isLocal(selectorElement)) return giveup();
-
-      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);
-      }
-      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));
-
+    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;
-
-      if (ast.Operator.INCREMENT_OPERATORS.contains(op.source) &&
-          !node.isPrefix) {
-        assert(getter != null);
-        return getter;
-      } else {
-        return 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 {
-      compiler.internalError(node, "Unknown assignment operator ${op.source}");
-      return null;
+      // Setter or index-setter invocation
+      assert(node.receiver != null);
+      if (node.receiver.isSuper()) return giveup();
+
+      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);
+      add(new ir.LetCont(k, invoke));
+      return args.last;
     }
   }
 
   ir.Primitive visitNewExpression(ast.NewExpression node) {
-    assert(isOpen);
+    if (node.isConst) {
+      return giveup(); // TODO(asgerf): Const constructor call.
+    }
     FunctionElement element = elements[node.send];
     if (Elements.isUnresolved(element)) {
       return giveup();
     }
-    Selector selector = elements.getSelector(node.send);
-    ast.Node selectorNode = node.send.selector;
+    ast.Node selector = node.send.selector;
     GenericType type = elements.getType(node);
-    List<ir.Definition> args = node.send.arguments.toList(growable:false)
-                                        .map(visit).toList(growable:false);
-    if (node.isConst) {
-      List<ir.Primitive> arguments = new List<ir.Primitive>();
-      node.send.arguments.forEach((ast.Node node) {
-        arguments.add(visit(node));
-      });
-      ir.Primitive result = new ir.InvokeConstConstructor(type, element, selector,
-                                                     arguments);
-      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,
-        selector,
+        elements.getSelector(node.send),
         k,
         args);
     add(new ir.LetCont(k, invoke));
@@ -1269,8 +1214,6 @@
 
   bool visitType(DartType type, Null _) => false;
 
-  bool visitDynamicType(DynamicType type, Null _) => true;
-
   bool visitVoidType(VoidType type, Null _) => true;
 
   // Currently, InterfaceType and TypedefType are supported so long as they
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index 23326b1..6db0e8f 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -187,31 +187,6 @@
   accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
 }
 
-class InvokeConstConstructor extends Primitive {
-  final GenericType type;
-  final FunctionElement constructor;
-  final List<Reference> arguments;
-  final Selector selector;
-
-  /// 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)
-      : arguments = _referenceList(args) {
-    assert(constructor.isConstructor);
-    assert(type.element == constructor.enclosingElement);
-  }
-
-  accept(Visitor visitor) => visitor.visitInvokeConstConstructor(this);
-}
-
 /// Invoke [toString] on each argument and concatenate the results.
 class ConcatenateStrings extends Expression {
   final Reference continuation;
@@ -364,7 +339,6 @@
   T visitLiteralList(LiteralList node) => visitPrimitive(node);
   T visitLiteralMap(LiteralMap node) => visitPrimitive(node);
   T visitConstant(Constant node) => visitPrimitive(node);
-  T visitInvokeConstConstructor(InvokeConstConstructor node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
 
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 922b3ea..38a4ae9 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -144,14 +144,6 @@
     printStmt(dummy, "LiteralMap (${entries.join(', ')})");
   }
 
-  visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
-    String dummy = names.name(node);
-    String values = node.arguments.map(formatReference).join(', ');
-    printStmt(dummy, "ConstConstruction ($values)");
-  }
-
-
-
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index bd96b3c..845447f 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -1003,12 +1003,6 @@
 }
 
 class Operator extends Identifier {
-  static const COMPLEX_OPERATORS =
-      const ["--", "++", '+=', "-=", "*=", "/=", "%=", "&=", "|=", "~/=", "^=",
-             ">>=", "<<="];
-
-  static const INCREMENT_OPERATORS = const <String>["++", "--"];
-
   Operator(Token token) : super(token);
 
   Operator asOperator() => this;
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index b8ba83b..d820c22 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -2789,7 +2789,7 @@
   String toString() => "RuntimeError: $message";
 }
 
-class DeferredNotLoadedError extends Error implements NoSuchMethodError {
+class DeferredNotLoadedError extends Error {
   String libraryName;
 
   DeferredNotLoadedError(this.libraryName);
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 dcfe4c8..7722b94 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 json_rpc.Server _server;
+  final _server = new json_rpc.Server();
 
   /// Whether the application should exit when this connection closes.
   bool _exitOnClose = false;
 
-  WebSocketApi(CompatibleWebSocket socket, this._environment)
-      : _server = new json_rpc.Server(socket) {
+  WebSocketApi(this._socket, this._environment) {
     _server.registerMethod("urlToAssetId", _urlToAssetId);
     _server.registerMethod("pathToUrls", _pathToUrls);
     _server.registerMethod("serveDirectory", _serveDirectory);
@@ -51,7 +51,11 @@
   /// complete with an error if the socket had an error, otherwise it will
   /// complete to `null`.
   Future listen() {
-    return _server.listen().then((_) {
+    return _socket.listen((request) {
+      _server.parseRequest(request).then((response) {
+        if (response != null) _socket.add(response);
+      });
+    }, cancelOnError: true).asFuture().then((_) {
       if (!_exitOnClose) return;
       log.message("WebSocket connection closed, terminating.");
       flushThenExit(exit_codes.SUCCESS);
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index 13f87af..08c30fd 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -87,21 +87,6 @@
              "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);
       });
@@ -125,8 +110,7 @@
     });
 
     if (timeoutLength == null) return future;
-    return timeout(future, timeoutLength, request.url,
-        'fetching URL "${request.url}"');
+    return timeout(future, timeoutLength, 'fetching URL "${request.url}"');
   }
 
   /// Logs the fact that [request] was sent, and information about it.
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index 6e11973..d023350 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -630,34 +630,22 @@
       environment: environment));
 }
 
-/// 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.
+/// 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).
 ///
 /// Note that timing out will not cancel the asynchronous operation behind
 /// [input].
-Future timeout(Future input, int milliseconds, Uri url, String description) {
+Future timeout(Future input, int milliseconds, String description) {
   // TODO(nwiez): Replace this with [Future.timeout].
   var completer = new Completer();
   var duration = new Duration(milliseconds: milliseconds);
   var timer = new Timer(duration, () {
-    // 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());
+    completer.completeError(new TimeoutException(
+        'Timed out while $description.', duration),
+        new Chain.current());
   });
   input.then((value) {
     if (completer.isCompleted) return;
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
index af7c0af..059d480 100644
--- a/sdk/lib/_internal/pub/lib/src/progress.dart
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -8,7 +8,6 @@
 import 'dart:io';
 
 import 'log.dart' as log;
-import 'utils.dart';
 
 /// A live-updating progress indicator for long-running log entries.
 class Progress {
@@ -61,7 +60,19 @@
   }
 
   /// Gets the current progress time as a parenthesized, formatted string.
-  String get _time => "(${niceDuration(_stopwatch.elapsed)})";
+  String get _time {
+    var elapsed = _stopwatch.elapsed;
+    var time = "(";
+
+    // TODO(rnystrom): Move this somewhere reusable.
+    if (elapsed.inMinutes > 0) {
+      time += "${elapsed.inMinutes}:";
+    }
+
+    var s = elapsed.inSeconds % 59;
+    var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
+    return time + "$s.${ms}s)";
+  }
 
   /// Refreshes the progress line.
   void _update() {
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index affc9b0..56a76a9 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -179,8 +179,8 @@
       return httpClient.send(new http.Request("GET", url))
           .then((response) => response.stream)
           .then((stream) {
-        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT, url,
-            'downloading $url');
+        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT,
+            'fetching URL "$url"');
       }).then((_) {
         // Remove the existing directory if it exists. This will happen if
         // we're forcing a download to repair the cache.
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 7903d7f..d9ab8a9 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -620,15 +620,6 @@
   return relative;
 }
 
-/// 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) =>
@@ -853,8 +844,7 @@
   'IsolateSpawnException',
   // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed.
   'FileSystemException', 'HttpException', 'OSError',
-  'ProcessException', 'SocketException', 'TimeoutException',
-  'WebSocketException'
+  'ProcessException', 'SocketException', 'WebSocketException'
 ]);
 
 /// Returns whether [error] is a user-facing error object. This includes both
@@ -875,7 +865,6 @@
     error is http.ClientException ||
     error is OSError ||
     error is ProcessException ||
-    error is TimeoutException ||
     error is SocketException ||
     error is WebSocketException;
 }
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index b42cb9b..d4fa045 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -5,6 +5,12 @@
 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
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index b244191..adf54f1 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -91,8 +91,7 @@
 library dart.async;
 
 import "dart:collection";
-import "dart:_internal" show deprecated, printToZone, printToConsole,
-                             IterableElementError;
+import "dart:_internal" show deprecated, printToZone, printToConsole;
 
 part 'async_error.dart';
 part 'broadcast_stream_controller.dart';
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 2392739..ab50c24 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -501,11 +501,7 @@
       onError: result._completeError,
       onDone: () {
         if (!seenFirst) {
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            result._completeError(e, s);
-          }
+          result._completeError(new StateError("No elements"));
         } else {
           result._complete(value);
         }
@@ -906,11 +902,7 @@
       },
       onError: future._completeError,
       onDone: () {
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("No elements"));
       },
       cancelOnError: true);
     return future;
@@ -941,11 +933,7 @@
           future._complete(result);
           return;
         }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("No elements"));
       },
       cancelOnError: true);
     return future;
@@ -968,11 +956,8 @@
       (T value) {
         if (foundResult) {
           // This is the second element we get.
-          try {
-            throw IterableElementError.tooMany();
-          } catch (e, s) {
-            _cancelAndError(subscription, future, e, s);
-          }
+          Error error = new StateError("More than one element");
+          _cancelAndError(subscription, future, error, null);
           return;
         }
         foundResult = true;
@@ -984,11 +969,7 @@
           future._complete(result);
           return;
         }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("No elements"));
       },
       cancelOnError: true);
     return future;
@@ -1036,11 +1017,7 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("firstMatch ended without match"));
       },
       cancelOnError: true);
     return future;
@@ -1081,11 +1058,7 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("lastMatch ended without match"));
       },
       cancelOnError: true);
     return future;
@@ -1109,11 +1082,11 @@
           (bool isMatch) {
             if (isMatch) {
               if (foundResult) {
-                try {
-                  throw IterableElementError.tooMany();
-                } catch (e, s) {
-                  _cancelAndError(subscription, future, e, s);
-                }
+                _cancelAndError(
+                    subscription,
+                    future,
+                    new StateError('Multiple matches for "single"'),
+                    null);
                 return;
               }
               foundResult = true;
@@ -1129,11 +1102,7 @@
           future._complete(result);
           return;
         }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          future._completeError(e, s);
-        }
+        future._completeError(new StateError("single ended without match"));
       },
       cancelOnError: true);
     return future;
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index d838dc5..2d41870 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -13,7 +13,6 @@
 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 acdf220..17cc287 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -10,7 +10,6 @@
     'iterable.dart',
     'list.dart',
     'lists.dart',
-    'lru.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/site/try/create_manifest.sh b/site/try/create_manifest.sh
old mode 100644
new mode 100755
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 3c29aad..c866076 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -792,6 +792,8 @@
 # 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
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 1a32264..49bbb13 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -392,4 +392,3 @@
 [ $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/html/html.status b/tests/html/html.status
index 0801d39..782d633 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -38,6 +38,7 @@
 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
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
@@ -47,8 +48,6 @@
 element_offset_test/offset: Pass, Fail # Issue 17550
 mouse_event_test: Skip # Times out. Issue 19127
 css_test/supportsPointConversions: Skip # Times out. Issue 19127
-css_test/functional: Skip # Times out. Issue 19276
-blob_constructor_test: Skip # Times out. Issue 19276
 canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: RuntimeError # Issue 19127
 
diff --git a/tests/html/path_observer_test.dart b/tests/html/path_observer_test.dart
new file mode 100644
index 0000000..d6db89b
--- /dev/null
+++ b/tests/html/path_observer_test.dart
@@ -0,0 +1,255 @@
+// 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 'dart:html' show PathObserver;
+import 'package:unittest/html_config.dart';
+import 'package:mdv_observe/mdv_observe.dart';
+import 'package:unittest/unittest.dart';
+
+// This file contains code ported from:
+// https://github.com/rafaelw/ChangeSummary/blob/master/tests/test.js
+
+main() {
+  useHtmlConfiguration();
+  group('PathObserver', observePathTests);
+}
+
+observePath(obj, path) => new PathObserver(obj, path);
+
+sym(x) => new Symbol(x);
+
+toSymbolMap(Map map) {
+  var result = new ObservableMap.linked();
+  map.forEach((key, value) {
+    if (value is Map) value = toSymbolMap(value);
+    result[new Symbol(key)] = value;
+  });
+  return result;
+}
+
+observePathTests() {
+
+  test('Degenerate Values', () {
+    expect(observePath(null, '').value, null);
+    expect(observePath(123, '').value, 123);
+    expect(observePath(123, 'foo.bar.baz').value, null);
+
+    // shouldn't throw:
+    observePath(123, '').values.listen((_) {}).cancel();
+    observePath(null, '').value = null;
+    observePath(123, '').value = 42;
+    observePath(123, 'foo.bar.baz').value = 42;
+
+    var foo = {};
+    expect(observePath(foo, '').value, foo);
+
+    foo = new Object();
+    expect(observePath(foo, '').value, foo);
+
+    expect(observePath(foo, 'a/3!').value, null);
+  });
+
+  test('get value at path ObservableBox', () {
+    var obj = new ObservableBox(new ObservableBox(new ObservableBox(1)));
+
+    expect(observePath(obj, '').value, obj);
+    expect(observePath(obj, 'value').value, obj.value);
+    expect(observePath(obj, 'value.value').value, obj.value.value);
+    expect(observePath(obj, 'value.value.value').value, 1);
+
+    obj.value.value.value = 2;
+    expect(observePath(obj, 'value.value.value').value, 2);
+
+    obj.value.value = new ObservableBox(3);
+    expect(observePath(obj, 'value.value.value').value, 3);
+
+    obj.value = new ObservableBox(4);
+    expect(observePath(obj, 'value.value.value').value, null);
+    expect(observePath(obj, 'value.value').value, 4);
+  });
+
+
+  test('get value at path ObservableMap', () {
+    var obj = toSymbolMap({'a': {'b': {'c': 1}}});
+
+    expect(observePath(obj, '').value, obj);
+    expect(observePath(obj, 'a').value, obj[sym('a')]);
+    expect(observePath(obj, 'a.b').value, obj[sym('a')][sym('b')]);
+    expect(observePath(obj, 'a.b.c').value, 1);
+
+    obj[sym('a')][sym('b')][sym('c')] = 2;
+    expect(observePath(obj, 'a.b.c').value, 2);
+
+    obj[sym('a')][sym('b')] = toSymbolMap({'c': 3});
+    expect(observePath(obj, 'a.b.c').value, 3);
+
+    obj[sym('a')] = toSymbolMap({'b': 4});
+    expect(observePath(obj, 'a.b.c').value, null);
+    expect(observePath(obj, 'a.b').value, 4);
+  });
+
+  test('set value at path', () {
+    var obj = toSymbolMap({});
+    observePath(obj, 'foo').value = 3;
+    expect(obj[sym('foo')], 3);
+
+    var bar = toSymbolMap({ 'baz': 3 });
+    observePath(obj, 'bar').value = bar;
+    expect(obj[sym('bar')], bar);
+
+    observePath(obj, 'bar.baz.bat').value = 'not here';
+    expect(observePath(obj, 'bar.baz.bat').value, null);
+  });
+
+  test('set value back to same', () {
+    var obj = toSymbolMap({});
+    var path = observePath(obj, 'foo');
+    var values = [];
+    path.values.listen((v) { values.add(v); });
+
+    path.value = 3;
+    expect(obj[sym('foo')], 3);
+    expect(path.value, 3);
+
+    observePath(obj, 'foo').value = 2;
+    deliverChangeRecords();
+    expect(path.value, 2);
+    expect(observePath(obj, 'foo').value, 2);
+
+    observePath(obj, 'foo').value = 3;
+    deliverChangeRecords();
+    expect(path.value, 3);
+
+    deliverChangeRecords();
+    expect(values, [2, 3]);
+  });
+
+  test('Observe and Unobserve - Paths', () {
+    var arr = toSymbolMap({});
+
+    arr[sym('foo')] = 'bar';
+    var fooValues = [];
+    var fooPath = observePath(arr, 'foo');
+    var fooSub = fooPath.values.listen((v) {
+      fooValues.add(v);
+    });
+    arr[sym('foo')] = 'baz';
+    arr[sym('bat')] = 'bag';
+    var batValues = [];
+    var batPath = observePath(arr, 'bat');
+    var batSub = batPath.values.listen((v) {
+      batValues.add(v);
+    });
+
+    deliverChangeRecords();
+    expect(fooValues, ['baz']);
+    expect(batValues, []);
+
+    arr[sym('foo')] = 'bar';
+    fooSub.cancel();
+    arr[sym('bat')] = 'boo';
+    batSub.cancel();
+    arr[sym('bat')] = 'boot';
+
+    deliverChangeRecords();
+    expect(fooValues, ['baz']);
+    expect(batValues, []);
+  });
+
+  test('Path Value With Indices', () {
+    var model = toObservable([]);
+    observePath(model, '0').values.listen(expectAsync1((v) {
+      expect(v, 123);
+    }));
+    model.add(123);
+  });
+
+  test('Path Observation', () {
+    var model = new TestModel(const Symbol('a'),
+        new TestModel(const Symbol('b'),
+            new TestModel(const Symbol('c'), 'hello, world')));
+
+    var path = observePath(model, 'a.b.c');
+    var lastValue = null;
+    var sub = path.values.listen((v) { lastValue = v; });
+
+    model.value.value.value = 'hello, mom';
+
+    expect(lastValue, null);
+    deliverChangeRecords();
+    expect(lastValue, 'hello, mom');
+
+    model.value.value = new TestModel(const Symbol('c'), 'hello, dad');
+    deliverChangeRecords();
+    expect(lastValue, 'hello, dad');
+
+    model.value = new TestModel(const Symbol('b'),
+        new TestModel(const Symbol('c'), 'hello, you'));
+    deliverChangeRecords();
+    expect(lastValue, 'hello, you');
+
+    model.value.value = 1;
+    deliverChangeRecords();
+    expect(lastValue, null);
+
+    // Stop observing
+    sub.cancel();
+
+    model.value.value = new TestModel(const Symbol('c'),
+        'hello, back again -- but not observing');
+    deliverChangeRecords();
+    expect(lastValue, null);
+
+    // Resume observing
+    sub = path.values.listen((v) { lastValue = v; });
+
+    model.value.value.value = 'hello. Back for reals';
+    deliverChangeRecords();
+    expect(lastValue, 'hello. Back for reals');
+  });
+
+  test('observe map', () {
+    var model = toSymbolMap({'a': 1});
+    var path = observePath(model, 'a');
+
+    var values = [path.value];
+    var sub = path.values.listen((v) { values.add(v); });
+    expect(values, [1]);
+
+    model[sym('a')] = 2;
+    deliverChangeRecords();
+    expect(values, [1, 2]);
+
+    sub.cancel();
+    model[sym('a')] = 3;
+    deliverChangeRecords();
+    expect(values, [1, 2]);
+  });
+}
+
+class TestModel extends ObservableBase {
+  final Symbol fieldName;
+  var _value;
+
+  TestModel(this.fieldName, [initialValue]) : _value = initialValue;
+
+  get value => _value;
+
+  void set value(newValue) {
+    _value = notifyPropertyChange(fieldName, _value, newValue);
+  }
+
+  getValueWorkaround(key) {
+    if (key == fieldName) return value;
+    return null;
+  }
+  void setValueWorkaround(key, newValue) {
+    if (key == fieldName) value = newValue;
+  }
+
+  toString() => '#<$runtimeType $fieldName: $_value>';
+}
+
+_record(key, oldValue, newValue, [kind = ChangeRecord.FIELD]) =>
+    new ChangeRecord(key, oldValue, newValue, kind: kind);
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index fcd983f..fae13ca 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -79,9 +79,6 @@
 [ $jscl || $runtime == ie9 ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
-[ $compiler == none && $runtime == ContentShellOnAndroid ]
-nested_spawn2_test: Skip # Issue 19276: 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/deferred_inlined_test.dart b/tests/language/deferred_inlined_test.dart
new file mode 100644
index 0000000..4808a3f
--- /dev/null
+++ b/tests/language/deferred_inlined_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.
+// VMOptions=--optimization-counter-threshold=10
+
+// Declares foo that returns 42.
+import "deferred_constraints_lib2.dart" deferred as lib;
+
+import 'package:expect/expect.dart';
+
+bool libLoaded = false;
+
+main() {
+  Expect.equals(88, heyhey());
+
+  // Trigger optimization of 'hehey' which inlines 'barbar'.
+  for (int i = 0; i < 30000; i++) {
+    heyhey();
+  }
+
+  lib.loadLibrary().then((_) {
+    libLoaded = true;
+    Expect.equals(42, heyhey());
+  });
+}
+
+
+// Inline bar in optimized code.
+heyhey() => barbar();
+
+
+barbar() {
+  if (libLoaded) {
+    // Returns 42.
+    return lib.foo();
+  }
+  return 88;
+}
\ No newline at end of file
diff --git a/tests/language/language.status b/tests/language/language.status
index 8d34884..0b9bc88 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -117,11 +117,6 @@
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
 
-[ $compiler == none && $runtime == ContentShellOnAndroid ]
-closure7_test: Skip # Times out. Issue 19276
-abstract_exact_selector_test/01: Skip # Times out. Issue 19276
-function_subtype_local1_test: Skip # Times out. Issue 19276
-
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
 generic_instanceof3_test: Pass, Crash # Issue 17440.
 
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 62c5a0c..8190432 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -159,6 +159,20 @@
 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
+
 # The following tests are currently assumed to be failing because the test is wrong.
 #
 application_negative_test: CompileTimeError # Test Issue 14528
diff --git a/tests/language/reflect_core_vm_test.dart b/tests/language/reflect_core_vm_test.dart
new file mode 100644
index 0000000..d6e52f1
--- /dev/null
+++ b/tests/language/reflect_core_vm_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// Test reflection of private functions in core classes.
+
+import "package:expect/expect.dart";
+import "dart:mirrors";
+
+main() {
+  var s = "string";
+  var im = reflect(s);
+  try {
+    im.invoke(const Symbol("_setAt"), [0, 65]);
+    Expect.isTrue(false);  // Unreachable.
+  } catch (e) {
+    Expect.equals(true, e is NoSuchMethodError);
+  }
+}
+
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 825e911..5176cbf 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -291,10 +291,6 @@
 # Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 async/deferred/deferred_in_isolate_test: Fail
 
-[$compiler == none && $runtime == ContentShellOnAndroid ]
-mirrors/lazy_static_test: Skip # Times out. Issue 19276
-mirrors/mirrors_reader_test: Skip # Times out. Issue 19276
-
 [ $compiler == dart2js && $runtime != d8 ]
 async/schedule_microtask_test: Fail # Issue 9002
 
diff --git a/tests/standalone/javascript_compatibility_errors_test.dart b/tests/standalone/javascript_compatibility_errors_test.dart
index a384274..888ff20 100644
--- a/tests/standalone/javascript_compatibility_errors_test.dart
+++ b/tests/standalone/javascript_compatibility_errors_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 
 f(x, y) {
-  // Unoptimized and optimized code.
+  // 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
@@ -35,46 +35,30 @@
   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;  /// 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
+    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
 
-    "${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
+    "${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
   }
 }
 
 k(x, y) {
-  // Unoptimized and optimized code.
+  // Unoptimized code.
   1.5 is double;
   if (1.5 is double) { x++; }
   try { 1.5 as double; } on CastError catch (e) { }
@@ -111,14 +95,6 @@
   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;
@@ -138,14 +114,6 @@
     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)) { }
   }
 }
 
@@ -158,18 +126,16 @@
     e is Error && "$e".contains("Javascript Compatibility Error");
 
 main() {
-  // 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);
+  // 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);
+
   // 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 bb744b1..9d44700 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 and optimized code.
+  // Unoptimized code.
   1 is double;  /// 00: ok
   if (1 is double) { x++; }  /// 01: ok
   try { 1 as double; } on CastError catch (e) { }  /// 02: ok
@@ -35,41 +35,25 @@
   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;  /// 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
+    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
 
-    "${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
+    "${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
   }
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index b40d857..cd798b5c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -23,9 +23,9 @@
 #  * Making cherry-picks to stable channel
 #     - increase PATCH by 1
 #
-CHANNEL be
+CHANNEL dev
 MAJOR 1
 MINOR 5
 PATCH 0
-PRERELEASE 0
-PRERELEASE_PATCH 0
+PRERELEASE 4
+PRERELEASE_PATCH 4
diff --git a/tools/build.py b/tools/build.py
index 4dfb024..e0205ba 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -401,25 +401,16 @@
             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',
-                      config_name,
+                      build_config,
                       project_file
                      ]
             else:
               args = [options.devenv + os.sep + options.executable,
                       '/build',
-                      config_name,
+                      build_config,
                       '/project',
                       target,
                       project_file
diff --git a/tools/dartium/download_multivm.py b/tools/dartium/download_multivm.py
index a97c84f..0a31bce 100755
--- a/tools/dartium/download_multivm.py
+++ b/tools/dartium/download_multivm.py
@@ -23,8 +23,6 @@
 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/download_shellscript_template.bat b/tools/dartium/download_shellscript_template.bat
index bf81832..d41951d 100644
--- a/tools/dartium/download_shellscript_template.bat
+++ b/tools/dartium/download_shellscript_template.bat
@@ -1,16 +1,16 @@
-@REM Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-@REM for details. All rights reserved. Use of this source code is governed by a
-@REM BSD-style license that can be found in the LICENSE file.
-
-@REM This script will download VAR_DOWNLOAD_URL to VAR_DESTINATION in the
-@REM current working directory.
-
-@echo off
-
-set "CHROMIUM_DIR=%~dp0"
-set "SDK_BIN=%CHROMIUM_DIR%\..\dart-sdk\bin"
-
-set "DART=%SDK_BIN%\dart.exe"
-set "DOWNLOAD_SCRIPT=%CHROMIUM_DIR%\download_file.dart"
-
-"%DART%" "%DOWNLOAD_SCRIPT%" "VAR_DOWNLOAD_URL" "VAR_DESTINATION"
+@REM Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file

+@REM for details. All rights reserved. Use of this source code is governed by a

+@REM BSD-style license that can be found in the LICENSE file.

+

+@REM This script will download VAR_DOWNLOAD_URL to VAR_DESTINATION in the

+@REM current working directory.

+

+@echo off

+

+set "CHROMIUM_DIR=%~dp0"

+set "SDK_BIN=%CHROMIUM_DIR%\..\dart-sdk\bin"

+

+set "DART=%SDK_BIN%\dart.exe"

+set "DOWNLOAD_SCRIPT=%CHROMIUM_DIR%\download_file.dart"

+

+"%DART%" "%DOWNLOAD_SCRIPT%" "VAR_DOWNLOAD_URL" "VAR_DESTINATION"

diff --git a/tools/dom/src/PathObserver.dart b/tools/dom/src/PathObserver.dart
new file mode 100644
index 0000000..bc07ac1
--- /dev/null
+++ b/tools/dom/src/PathObserver.dart
@@ -0,0 +1,288 @@
+// 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 html;
+
+// This code is inspired by ChangeSummary:
+// https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
+// ...which underlies MDV. Since we don't need the functionality of
+// ChangeSummary, we just implement what we need for data bindings.
+// This allows our implementation to be much simpler.
+
+// TODO(jmesserly): should we make these types stronger, and require
+// Observable objects? Currently, it is fine to say something like:
+//     var path = new PathObserver(123, '');
+//     print(path.value); // "123"
+//
+// Furthermore this degenerate case is allowed:
+//     var path = new PathObserver(123, 'foo.bar.baz.qux');
+//     print(path.value); // "null"
+//
+// Here we see that any invalid (i.e. not Observable) value will break the
+// path chain without producing an error or exception.
+//
+// Now the real question: should we do this? For the former case, the behavior
+// is correct but we could chose to handle it in the dart:html bindings layer.
+// For the latter case, it might be better to throw an error so users can find
+// the problem.
+
+
+/**
+ * A data-bound path starting from a view-model or model object, for example
+ * `foo.bar.baz`.
+ *
+ * When the [values] stream is being listened to, this will observe changes to
+ * the object and any intermediate object along the path, and send [values]
+ * accordingly. When all listeners are unregistered it will stop observing
+ * the objects.
+ *
+ * This class is used to implement [Node.bind] and similar functionality.
+ */
+// TODO(jmesserly): find a better home for this type.
+@Experimental
+class PathObserver {
+  /** The object being observed. */
+  final object;
+
+  /** The path string. */
+  final String path;
+
+  /** True if the path is valid, otherwise false. */
+  final bool _isValid;
+
+  // TODO(jmesserly): same issue here as ObservableMixin: is there an easier
+  // way to get a broadcast stream?
+  StreamController _values;
+  Stream _valueStream;
+
+  _PropertyObserver _observer, _lastObserver;
+
+  Object _lastValue;
+  bool _scheduled = false;
+
+  /**
+   * Observes [path] on [object] for changes. This returns an object that can be
+   * used to get the changes and get/set the value at this path.
+   * See [PathObserver.values] and [PathObserver.value].
+   */
+  PathObserver(this.object, String path)
+    : path = path, _isValid = _isPathValid(path) {
+
+    // TODO(jmesserly): if the path is empty, or the object is! Observable, we
+    // can optimize the PathObserver to be more lightweight.
+
+    _values = new StreamController.broadcast(sync: true,
+                                             onListen: _observe,
+                                             onCancel: _unobserve);
+
+    if (_isValid) {
+      var segments = [];
+      for (var segment in path.trim().split('.')) {
+        if (segment == '') continue;
+        var index = int.parse(segment, onError: (_) {});
+        segments.add(index != null ? index : new Symbol(segment));
+      }
+
+      // Create the property observer linked list.
+      // Note that the structure of a path can't change after it is initially
+      // constructed, even though the objects along the path can change.
+      for (int i = segments.length - 1; i >= 0; i--) {
+        _observer = new _PropertyObserver(this, segments[i], _observer);
+        if (_lastObserver == null) _lastObserver = _observer;
+      }
+    }
+  }
+
+  // TODO(jmesserly): we could try adding the first value to the stream, but
+  // that delivers the first record async.
+  /**
+   * Listens to the stream, and invokes the [callback] immediately with the
+   * current [value]. This is useful for bindings, which want to be up-to-date
+   * immediately.
+   */
+  StreamSubscription bindSync(void callback(value)) {
+    var result = values.listen(callback);
+    callback(value);
+    return result;
+  }
+
+  // TODO(jmesserly): should this be a change record with the old value?
+  // TODO(jmesserly): should this be a broadcast stream? We only need
+  // single-subscription in the bindings system, so single sub saves overhead.
+  /**
+   * Gets the stream of values that were observed at this path.
+   * This returns a single-subscription stream.
+   */
+  Stream get values => _values.stream;
+
+  /** Force synchronous delivery of [values]. */
+  void _deliverValues() {
+    _scheduled = false;
+
+    var newValue = value;
+    if (!identical(_lastValue, newValue)) {
+      _values.add(newValue);
+      _lastValue = newValue;
+    }
+  }
+
+  void _observe() {
+    if (_observer != null) {
+      _lastValue = value;
+      _observer.observe();
+    }
+  }
+
+  void _unobserve() {
+    if (_observer != null) _observer.unobserve();
+  }
+
+  void _notifyChange() {
+    if (_scheduled) return;
+    _scheduled = true;
+
+    // TODO(jmesserly): should we have a guarenteed order with respect to other
+    // paths? If so, we could implement this fairly easily by sorting instances
+    // of this class by birth order before delivery.
+    queueChangeRecords(_deliverValues);
+  }
+
+  /** Gets the last reported value at this path. */
+  get value {
+    if (!_isValid) return null;
+    if (_observer == null) return object;
+    _observer.ensureValue(object);
+    return _lastObserver.value;
+  }
+
+  /** Sets the value at this path. */
+  void set value(Object value) {
+    // TODO(jmesserly): throw if property cannot be set?
+    // MDV seems tolerant of these error.
+    if (_observer == null || !_isValid) return;
+    _observer.ensureValue(object);
+    var last = _lastObserver;
+    if (_setObjectProperty(last._object, last._property, value)) {
+      // Technically, this would get updated asynchronously via a change record.
+      // However, it is nice if calling the getter will yield the same value
+      // that was just set. So we use this opportunity to update our cache.
+      last.value = value;
+    }
+  }
+}
+
+// TODO(jmesserly): these should go away in favor of mirrors!
+_getObjectProperty(object, property) {
+  if (object is List && property is int) {
+    if (property >= 0 && property < object.length) {
+      return object[property];
+    } else {
+      return null;
+    }
+  }
+
+  // TODO(jmesserly): what about length?
+  if (object is Map) return object[property];
+
+  if (object is Observable) return object.getValueWorkaround(property);
+
+  return null;
+}
+
+bool _setObjectProperty(object, property, value) {
+  if (object is List && property is int) {
+    object[property] = value;
+  } else if (object is Map) {
+    object[property] = value;
+  } else if (object is Observable) {
+    (object as Observable).setValueWorkaround(property, value);
+  } else {
+    return false;
+  }
+  return true;
+}
+
+
+class _PropertyObserver {
+  final PathObserver _path;
+  final _property;
+  final _PropertyObserver _next;
+
+  // TODO(jmesserly): would be nice not to store both of these.
+  Object _object;
+  Object _value;
+  StreamSubscription _sub;
+
+  _PropertyObserver(this._path, this._property, this._next);
+
+  get value => _value;
+
+  void set value(Object newValue) {
+    _value = newValue;
+    if (_next != null) {
+      if (_sub != null) _next.unobserve();
+      _next.ensureValue(_value);
+      if (_sub != null) _next.observe();
+    }
+  }
+
+  void ensureValue(object) {
+    // If we're observing, values should be up to date already.
+    if (_sub != null) return;
+
+    _object = object;
+    value = _getObjectProperty(object, _property);
+  }
+
+  void observe() {
+    if (_object is Observable) {
+      assert(_sub == null);
+      _sub = (_object as Observable).changes.listen(_onChange);
+    }
+    if (_next != null) _next.observe();
+  }
+
+  void unobserve() {
+    if (_sub == null) return;
+
+    _sub.cancel();
+    _sub = null;
+    if (_next != null) _next.unobserve();
+  }
+
+  void _onChange(List<ChangeRecord> changes) {
+    for (var change in changes) {
+      // TODO(jmesserly): what to do about "new Symbol" here?
+      // Ideally this would only preserve names if the user has opted in to
+      // them being preserved.
+      // TODO(jmesserly): should we drop observable maps with String keys?
+      // If so then we only need one check here.
+      if (change.changes(_property)) {
+        value = _getObjectProperty(_object, _property);
+        _path._notifyChange();
+        return;
+      }
+    }
+  }
+}
+
+// From: https://github.com/rafaelw/ChangeSummary/blob/master/change_summary.js
+
+const _pathIndentPart = r'[$a-z0-9_]+[$a-z0-9_\d]*';
+final _pathRegExp = new RegExp('^'
+    '(?:#?' + _pathIndentPart + ')?'
+    '(?:'
+      '(?:\\.' + _pathIndentPart + ')'
+    ')*'
+    r'$', caseSensitive: false);
+
+final _spacesRegExp = new RegExp(r'\s');
+
+bool _isPathValid(String s) {
+  s = s.replaceAll(_spacesRegExp, '');
+
+  if (s == '') return true;
+  if (s[0] == '.') return false;
+  return _pathRegExp.hasMatch(s);
+}
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 20d69be..970c1ae 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -19,7 +19,6 @@
       },
       'Dart_Win_x64_Base': {
         'abstract': 1,
-        'msvs_configuration_platform': 'x64',
       },
       'Dart_Win_simarm_Base': {
         'abstract': 1,
diff --git a/tools/task_kill.py b/tools/task_kill.py
index 9b905ee..b13dba5 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -38,7 +38,6 @@
     'content_shell': 'content_shell',
     'dart': 'dart',
     'editor': 'DartEditor',
-    'java': 'java',
     'eggplant': 'Eggplant',
     'firefox': 'firefox.exe',
     'git': 'git',
@@ -197,8 +196,6 @@
 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/test_options.dart b/tools/testing/dart/test_options.dart
index b41edfa..b880a72 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', 'arm64', 'mips',
+              ['all', 'ia32', 'x64', 'arm', 'mips',
                'simarm', 'simarm64', 'simmips'],
               'ia32'),
           new _TestOptionSpecification(
diff --git a/tools/utils.py b/tools/utils.py
index f4a3755..43947b5 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -50,8 +50,6 @@
   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):
@@ -530,8 +528,6 @@
     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/pub/pub.Makefile b/utils/pub/pub.Makefile
new file mode 100644
index 0000000..c1d628d
--- /dev/null
+++ b/utils/pub/pub.Makefile
@@ -0,0 +1,6 @@
+# This file is generated by gyp; do not edit.
+
+export builddir_name ?= dart/utils/pub/out
+.PHONY: all
+all:
+	$(MAKE) -C ../.. pub
diff --git a/utils/pub/pub.target.mk b/utils/pub/pub.target.mk
new file mode 100644
index 0000000..6362e21
--- /dev/null
+++ b/utils/pub/pub.target.mk
@@ -0,0 +1,38 @@
+# This file is generated by gyp; do not edit.
+
+TOOLSET := target
+TARGET := pub
+### Rules for action "generate_pub_snapshot":
+quiet_cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = ACTION dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot $@
+cmd_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot = LD_LIBRARY_PATH=$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd utils/pub; mkdir -p $(obj)/gen; "$(builddir)/dart" "--package-root=$(builddir)/packages/" "--generate-script-snapshot=$(obj)/gen/pub.dart.snapshot" ../../sdk/lib/_internal/pub/bin/pub.dart
+
+$(obj)/gen/pub.dart.snapshot: obj := $(abs_obj)
+$(obj)/gen/pub.dart.snapshot: builddir := $(abs_builddir)
+$(obj)/gen/pub.dart.snapshot: TOOLSET := $(TOOLSET)
+$(obj)/gen/pub.dart.snapshot: $(builddir)/dart sdk/lib/_internal/pub/bin/pub.dart sdk/lib/_internal/pub/lib/src/http.dart sdk/lib/_internal/pub/lib/src/utils.dart sdk/lib/_internal/pub/lib/src/command_deploy.dart sdk/lib/_internal/pub/lib/src/git_source.dart sdk/lib/_internal/pub/lib/src/command_install.dart sdk/lib/_internal/pub/lib/src/exit_codes.dart sdk/lib/_internal/pub/lib/src/command.dart sdk/lib/_internal/pub/lib/src/source_registry.dart sdk/lib/_internal/pub/lib/src/pubspec.dart sdk/lib/_internal/pub/lib/src/command_help.dart sdk/lib/_internal/pub/lib/src/oauth2.dart sdk/lib/_internal/pub/lib/src/command_uploader.dart sdk/lib/_internal/pub/lib/src/error_group.dart sdk/lib/_internal/pub/lib/src/directory_tree.dart sdk/lib/_internal/pub/lib/src/sdk.dart sdk/lib/_internal/pub/lib/src/dart.dart sdk/lib/_internal/pub/lib/src/hosted_source.dart sdk/lib/_internal/pub/lib/src/version.dart sdk/lib/_internal/pub/lib/src/git.dart sdk/lib/_internal/pub/lib/src/io.dart sdk/lib/_internal/pub/lib/src/system_cache.dart sdk/lib/_internal/pub/lib/src/safe_http_server.dart sdk/lib/_internal/pub/lib/src/command_update.dart sdk/lib/_internal/pub/lib/src/command_version.dart sdk/lib/_internal/pub/lib/src/validator.dart sdk/lib/_internal/pub/lib/src/command_cache.dart sdk/lib/_internal/pub/lib/src/source.dart sdk/lib/_internal/pub/lib/src/command_lish.dart sdk/lib/_internal/pub/lib/src/package.dart sdk/lib/_internal/pub/lib/src/log.dart sdk/lib/_internal/pub/lib/src/entrypoint.dart sdk/lib/_internal/pub/lib/src/lock_file.dart sdk/lib/_internal/pub/lib/src/path_source.dart sdk/lib/_internal/pub/lib/src/validator/name.dart sdk/lib/_internal/pub/lib/src/validator/size.dart sdk/lib/_internal/pub/lib/src/validator/pubspec_field.dart sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart sdk/lib/_internal/pub/lib/src/validator/directory.dart sdk/lib/_internal/pub/lib/src/validator/utf8_readme.dart sdk/lib/_internal/pub/lib/src/validator/dependency.dart sdk/lib/_internal/pub/lib/src/validator/license.dart sdk/lib/_internal/pub/lib/src/validator/lib.dart sdk/lib/_internal/pub/lib/src/solver/version_solver.dart sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart sdk/lib/_internal/pub/test/command_line_config.dart sdk/lib/_internal/pub/test/version_test.dart sdk/lib/_internal/pub/test/io_test.dart sdk/lib/_internal/pub/test/pub_cache_test.dart sdk/lib/_internal/pub/test/test_pub.dart sdk/lib/_internal/pub/test/lock_file_test.dart sdk/lib/_internal/pub/test/real_version_test.dart sdk/lib/_internal/pub/test/utils_test.dart sdk/lib/_internal/pub/test/directory_tree_test.dart sdk/lib/_internal/pub/test/unknown_source_test.dart sdk/lib/_internal/pub/test/dev_dependency_test.dart sdk/lib/_internal/pub/test/package_files_test.dart sdk/lib/_internal/pub/test/pubspec_test.dart sdk/lib/_internal/pub/test/pub_test.dart sdk/lib/_internal/pub/test/pub_install_and_update_test.dart sdk/lib/_internal/pub/test/version_solver_test.dart sdk/lib/_internal/pub/test/descriptor.dart sdk/lib/_internal/pub/test/error_group_test.dart sdk/lib/_internal/pub/test/pub_uploader_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_doesnt_redirect_test.dart sdk/lib/_internal/pub/test/lish/cloud_storage_upload_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/utils.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_error_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_is_canceled_test.dart sdk/lib/_internal/pub/test/lish/force_cannot_be_combined_with_dry_run_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_is_not_a_map_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_a_malformed_success_test.dart sdk/lib/_internal/pub/test/lish/package_creation_provides_an_error_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_url_test.dart sdk/lib/_internal/pub/test/lish/force_does_not_publish_if_there_are_errors_test.dart sdk/lib/_internal/pub/test/lish/upload_form_is_missing_fields_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_an_error_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_a_warning_test.dart sdk/lib/_internal/pub/test/lish/package_validation_has_a_warning_and_continues_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_tests_are_no_warnings_or_errors_test.dart sdk/lib/_internal/pub/test/lish/preview_package_validation_has_no_warnings_test.dart sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart sdk/lib/_internal/pub/test/lish/upload_form_url_is_not_a_string_test.dart sdk/lib/_internal/pub/test/lish/force_publishes_if_there_are_warnings_test.dart sdk/lib/_internal/pub/test/lish/upload_form_fields_has_a_non_string_value_test.dart sdk/lib/_internal/pub/test/lish/upload_form_provides_invalid_json_test.dart sdk/lib/_internal/pub/test/update/git/do_not_update_if_unneeded_test.dart sdk/lib/_internal/pub/test/update/git/update_to_incompatible_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_to_nonexistent_pubspec_test.dart sdk/lib/_internal/pub/test/update/git/update_locked_test.dart sdk/lib/_internal/pub/test/update/git/update_one_locked_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_dependers_test.dart sdk/lib/_internal/pub/test/update/hosted/unlock_if_necessary_test.dart sdk/lib/_internal/pub/test/update/hosted/update_removed_constraints_test.dart sdk/lib/_internal/pub/test/validator/license_test.dart sdk/lib/_internal/pub/test/validator/utils.dart sdk/lib/_internal/pub/test/validator/pubspec_field_test.dart sdk/lib/_internal/pub/test/validator/dependency_test.dart sdk/lib/_internal/pub/test/validator/directory_test.dart sdk/lib/_internal/pub/test/validator/name_test.dart sdk/lib/_internal/pub/test/validator/lib_test.dart sdk/lib/_internal/pub/test/validator/size_test.dart sdk/lib/_internal/pub/test/validator/utf8_readme_test.dart sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart sdk/lib/_internal/pub/test/oauth2/utils.dart sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_server_rejected_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_no_credentials_authenticates_and_saves_credentials_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_refreshes_and_saves_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_pre_existing_credentials_does_not_authenticate_test.dart sdk/lib/_internal/pub/test/oauth2/with_an_expired_credentials_without_a_refresh_token_authenticates_again_test.dart sdk/lib/_internal/pub/test/oauth2/with_a_malformed_credentials_authenticates_again_test.dart sdk/lib/_internal/pub/test/descriptor/tar.dart sdk/lib/_internal/pub/test/descriptor/git.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart sdk/lib/_internal/pub/test/hosted/offline_test.dart sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_url_resolve_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_transitive_dependency_test.dart sdk/lib/_internal/pub/test/hosted/remove_removed_dependency_test.dart sdk/lib/_internal/pub/test/install/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/broken_symlink_test.dart sdk/lib/_internal/pub/test/install/switch_source_test.dart sdk/lib/_internal/pub/test/install/git/check_out_transitive_test.dart sdk/lib/_internal/pub/test/install/git/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_with_trailing_slash_test.dart sdk/lib/_internal/pub/test/install/git/dependency_name_match_pubspec_test.dart sdk/lib/_internal/pub/test/install/git/check_out_branch_test.dart sdk/lib/_internal/pub/test/install/git/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/git/check_out_and_update_test.dart sdk/lib/_internal/pub/test/install/git/check_out_twice_test.dart sdk/lib/_internal/pub/test/install/git/check_out_test.dart sdk/lib/_internal/pub/test/install/git/lock_version_test.dart sdk/lib/_internal/pub/test/install/git/require_pubspec_name_test.dart sdk/lib/_internal/pub/test/install/git/check_out_revision_test.dart sdk/lib/_internal/pub/test/install/git/different_repo_name_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_incompatible_test.dart sdk/lib/_internal/pub/test/install/hosted/do_not_update_on_removed_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_test.dart sdk/lib/_internal/pub/test/install/hosted/install_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_compatible_test.dart sdk/lib/_internal/pub/test/install/hosted/install_transitive_test.dart sdk/lib/_internal/pub/test/install/hosted/unlock_if_new_is_unsatisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/stay_locked_if_new_is_satisfied_test.dart sdk/lib/_internal/pub/test/install/hosted/cached_pubspec_test.dart sdk/lib/_internal/pub/test/install/hosted/resolve_constraints_test.dart sdk/lib/_internal/pub/test/install/hosted/repair_cache_test.dart sdk/lib/_internal/pub/test/install/path/nonexistent_dir_test.dart sdk/lib/_internal/pub/test/install/path/absolute_path_test.dart sdk/lib/_internal/pub/test/install/path/relative_symlink_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_test.dart sdk/lib/_internal/pub/test/install/path/shared_dependency_symlink_test.dart sdk/lib/_internal/pub/test/install/path/absolute_symlink_test.dart sdk/lib/_internal/pub/test/install/path/no_pubspec_test.dart sdk/lib/_internal/pub/test/install/path/relative_path_test.dart sdk/lib/_internal/pub/test/install/path/path_is_file_test.dart sdk/lib/_internal/pub/test/deploy/copies_non_dart_files_to_deploy_test.dart sdk/lib/_internal/pub/test/deploy/ignores_non_entrypoint_dart_files_test.dart sdk/lib/_internal/pub/test/deploy/compiles_dart_entrypoints_to_dart_and_js_test.dart sdk/lib/_internal/pub/test/deploy/reports_dart_parse_errors_test.dart sdk/lib/_internal/pub/test/deploy/copies_dart_js_next_to_entrypoints_test.dart sdk/lib/_internal/pub/test/deploy/with_no_web_directory_test.dart sdk/lib/_internal/libraries.dart sdk/lib/_internal/compiler/compiler.dart sdk/lib/_internal/compiler/implementation/dart_types.dart sdk/lib/_internal/compiler/implementation/string_validator.dart sdk/lib/_internal/compiler/implementation/world.dart sdk/lib/_internal/compiler/implementation/typechecker.dart sdk/lib/_internal/compiler/implementation/filenames.dart sdk/lib/_internal/compiler/implementation/dart2js.dart sdk/lib/_internal/compiler/implementation/patch_parser.dart sdk/lib/_internal/compiler/implementation/constants.dart sdk/lib/_internal/compiler/implementation/script.dart sdk/lib/_internal/compiler/implementation/library_loader.dart sdk/lib/_internal/compiler/implementation/enqueue.dart sdk/lib/_internal/compiler/implementation/compiler.dart sdk/lib/_internal/compiler/implementation/diagnostic_listener.dart sdk/lib/_internal/compiler/implementation/warnings.dart sdk/lib/_internal/compiler/implementation/source_file_provider.dart sdk/lib/_internal/compiler/implementation/tree_validator.dart sdk/lib/_internal/compiler/implementation/apiimpl.dart sdk/lib/_internal/compiler/implementation/native_handler.dart sdk/lib/_internal/compiler/implementation/constant_system_dart.dart sdk/lib/_internal/compiler/implementation/dart2jslib.dart sdk/lib/_internal/compiler/implementation/compile_time_constants.dart sdk/lib/_internal/compiler/implementation/closure.dart sdk/lib/_internal/compiler/implementation/code_buffer.dart sdk/lib/_internal/compiler/implementation/source_file.dart sdk/lib/_internal/compiler/implementation/deferred_load.dart sdk/lib/_internal/compiler/implementation/resolved_visitor.dart sdk/lib/_internal/compiler/implementation/colors.dart sdk/lib/_internal/compiler/implementation/source_map_builder.dart sdk/lib/_internal/compiler/implementation/constant_system.dart sdk/lib/_internal/compiler/implementation/util/characters.dart sdk/lib/_internal/compiler/implementation/util/util.dart sdk/lib/_internal/compiler/implementation/util/uri_extras.dart sdk/lib/_internal/compiler/implementation/util/link_implementation.dart sdk/lib/_internal/compiler/implementation/util/link.dart sdk/lib/_internal/compiler/implementation/util/util_implementation.dart sdk/lib/_internal/compiler/implementation/tools/mini_parser.dart sdk/lib/_internal/compiler/implementation/dart_backend/utils.dart sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/emitter.dart sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart sdk/lib/_internal/compiler/implementation/dart_backend/renamer.dart sdk/lib/_internal/compiler/implementation/js_backend/minify_namer.dart sdk/lib/_internal/compiler/implementation/js_backend/namer.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart sdk/lib/_internal/compiler/implementation/js_backend/emitter_no_eval.dart sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart sdk/lib/_internal/compiler/implementation/js_backend/backend.dart sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart sdk/lib/_internal/compiler/implementation/lib/string_helper.dart sdk/lib/_internal/compiler/implementation/lib/collection_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_rti.dart sdk/lib/_internal/compiler/implementation/lib/core_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_array.dart sdk/lib/_internal/compiler/implementation/lib/mirrors_patch.dart sdk/lib/_internal/compiler/implementation/lib/isolate_patch.dart sdk/lib/_internal/compiler/implementation/lib/async_patch.dart sdk/lib/_internal/compiler/implementation/lib/collection_dev_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_helper.dart sdk/lib/_internal/compiler/implementation/lib/scalarlist_patch.dart sdk/lib/_internal/compiler/implementation/lib/native_helper.dart sdk/lib/_internal/compiler/implementation/lib/io_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_number.dart sdk/lib/_internal/compiler/implementation/lib/regexp_helper.dart sdk/lib/_internal/compiler/implementation/lib/isolate_helper.dart sdk/lib/_internal/compiler/implementation/lib/js_mirrors.dart sdk/lib/_internal/compiler/implementation/lib/constant_map.dart sdk/lib/_internal/compiler/implementation/lib/typed_data_patch.dart sdk/lib/_internal/compiler/implementation/lib/math_patch.dart sdk/lib/_internal/compiler/implementation/lib/js_string.dart sdk/lib/_internal/compiler/implementation/lib/json_patch.dart sdk/lib/_internal/compiler/implementation/lib/foreign_helper.dart sdk/lib/_internal/compiler/implementation/lib/interceptors.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart sdk/lib/_internal/compiler/implementation/mirrors/util.dart sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart sdk/lib/_internal/compiler/implementation/resolution/scope.dart sdk/lib/_internal/compiler/implementation/resolution/resolution.dart sdk/lib/_internal/compiler/implementation/resolution/secret_tree_element.dart sdk/lib/_internal/compiler/implementation/resolution/members.dart sdk/lib/_internal/compiler/implementation/ssa/ssa.dart sdk/lib/_internal/compiler/implementation/ssa/bailout.dart sdk/lib/_internal/compiler/implementation/ssa/codegen.dart sdk/lib/_internal/compiler/implementation/ssa/types.dart sdk/lib/_internal/compiler/implementation/ssa/validate.dart sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart sdk/lib/_internal/compiler/implementation/ssa/optimize.dart sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart sdk/lib/_internal/compiler/implementation/ssa/nodes.dart sdk/lib/_internal/compiler/implementation/ssa/value_set.dart sdk/lib/_internal/compiler/implementation/ssa/builder.dart sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart sdk/lib/_internal/compiler/implementation/ssa/tracer.dart sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart sdk/lib/_internal/compiler/implementation/js/precedence.dart sdk/lib/_internal/compiler/implementation/js/nodes.dart sdk/lib/_internal/compiler/implementation/js/builder.dart sdk/lib/_internal/compiler/implementation/js/printer.dart sdk/lib/_internal/compiler/implementation/js/js.dart sdk/lib/_internal/compiler/implementation/types/types.dart sdk/lib/_internal/compiler/implementation/types/union_type_mask.dart sdk/lib/_internal/compiler/implementation/types/type_mask.dart sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/simple_types_inferrer.dart sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart sdk/lib/_internal/compiler/implementation/elements/elements.dart sdk/lib/_internal/compiler/implementation/elements/modelx.dart sdk/lib/_internal/compiler/implementation/universe/side_effects.dart sdk/lib/_internal/compiler/implementation/universe/selector_map.dart sdk/lib/_internal/compiler/implementation/universe/universe.dart sdk/lib/_internal/compiler/implementation/universe/function_set.dart sdk/lib/_internal/compiler/implementation/scanner/byte_array_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/byte_strings.dart sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.dart sdk/lib/_internal/compiler/implementation/scanner/listener.dart sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart sdk/lib/_internal/compiler/implementation/scanner/parser_task.dart sdk/lib/_internal/compiler/implementation/scanner/scanner.dart sdk/lib/_internal/compiler/implementation/scanner/keyword.dart sdk/lib/_internal/compiler/implementation/scanner/scanner_task.dart sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart sdk/lib/_internal/compiler/implementation/scanner/token.dart sdk/lib/_internal/compiler/implementation/scanner/parser.dart sdk/lib/_internal/compiler/implementation/scanner/array_based_scanner.dart sdk/lib/_internal/compiler/implementation/scanner/string_scanner.dart sdk/lib/_internal/compiler/implementation/tree/visitors.dart sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart sdk/lib/_internal/compiler/implementation/tree/unparser.dart sdk/lib/_internal/compiler/implementation/tree/tree.dart sdk/lib/_internal/compiler/implementation/tree/nodes.dart sdk/lib/_internal/compiler/implementation/tree/dartstring.dart sdk/lib/_internal/compiler/samples/jsonify/jsonify.dart sdk/lib/_internal/compiler/samples/compile_loop/compile_loop.dart sdk/lib/_internal/compiler/samples/leap/leap_leg.dart sdk/lib/_internal/compiler/samples/leap/request_cache.dart sdk/lib/_internal/compiler/samples/leap/leap_script.dart sdk/lib/_internal/compiler/samples/leap/leap_server.dart sdk/lib/_internal/compiler/samples/leap/leap.dart sdk/lib/_internal/compiler/samples/darttags/darttags.dart pkg/intl/lib/number_symbols.dart pkg/intl/lib/intl.dart pkg/intl/lib/number_format.dart pkg/intl/lib/date_format.dart pkg/intl/lib/number_symbols_data.dart pkg/intl/lib/date_symbol_data_http_request.dart pkg/intl/lib/intl_browser.dart pkg/intl/lib/bidi_utils.dart pkg/intl/lib/date_symbol_data_local.dart pkg/intl/lib/date_time_patterns.dart pkg/intl/lib/message_lookup_by_library.dart pkg/intl/lib/date_symbol_data_file.dart pkg/intl/lib/extract_messages.dart pkg/intl/lib/generate_localized.dart pkg/intl/lib/bidi_formatter.dart pkg/intl/lib/date_symbols.dart pkg/intl/lib/intl_standalone.dart pkg/intl/lib/src/date_format_helpers.dart pkg/intl/lib/src/http_request_data_reader.dart pkg/intl/lib/src/file_data_reader.dart pkg/intl/lib/src/date_format_internal.dart pkg/intl/lib/src/intl_message.dart pkg/intl/lib/src/intl_helpers.dart pkg/intl/lib/src/date_format_field.dart pkg/intl/lib/src/lazy_locale_data.dart pkg/intl/lib/src/data/dates/localeList.dart pkg/intl/test/date_time_format_local_odd_test.dart pkg/intl/test/data_directory.dart pkg/intl/test/date_time_format_local_even_test.dart pkg/intl/test/intl_message_basic_example_test.dart pkg/intl/test/number_test_data.dart pkg/intl/test/bidi_utils_test.dart pkg/intl/test/date_time_format_test_data.dart pkg/intl/test/number_closure_test.dart pkg/intl/test/date_time_format_file_even_test.dart pkg/intl/test/number_format_test.dart pkg/intl/test/intl_test.dart pkg/intl/test/find_default_locale_standalone_test.dart pkg/intl/test/date_time_format_test_core.dart pkg/intl/test/date_time_format_http_request_test.dart pkg/intl/test/date_time_format_uninitialized_test.dart pkg/intl/test/date_time_format_test_stub.dart pkg/intl/test/find_default_locale_browser_test.dart pkg/intl/test/bidi_format_test.dart pkg/intl/test/date_time_format_file_odd_test.dart pkg/intl/test/message_extraction/generate_from_json.dart pkg/intl/test/message_extraction/sample_with_messages.dart pkg/intl/test/message_extraction/make_hardcoded_translation.dart pkg/intl/test/message_extraction/part_of_sample_with_messages.dart pkg/intl/test/message_extraction/extract_to_json.dart pkg/intl/test/message_extraction/message_extraction_test.dart pkg/intl/tool/generate_locale_data_files.dart pkg/intl/example/basic/basic_example_runner.dart pkg/intl/example/basic/basic_example.dart pkg/intl/example/basic/messages_de.dart pkg/intl/example/basic/messages_all.dart pkg/intl/example/basic/messages_th_th.dart pkg/serialization/lib/serialization.dart pkg/serialization/lib/src/format.dart pkg/serialization/lib/src/serialization_rule.dart pkg/serialization/lib/src/serialization_helpers.dart pkg/serialization/lib/src/mirrors_helpers.dart pkg/serialization/lib/src/basic_rule.dart pkg/serialization/lib/src/reader_writer.dart pkg/serialization/test/serialization_test.dart pkg/serialization/test/test_models.dart pkg/serialization/test/polyfill_identity_map_test.dart pkg/serialization/test/no_library_test.dart pkg/analyzer_experimental/bin/analyzer.dart pkg/analyzer_experimental/lib/options.dart pkg/analyzer_experimental/lib/analyzer.dart pkg/analyzer_experimental/lib/src/utils.dart pkg/analyzer_experimental/lib/src/error_formatter.dart pkg/analyzer_experimental/lib/src/analyzer_impl.dart pkg/analyzer_experimental/lib/src/error.dart pkg/analyzer_experimental/lib/src/generated/constant.dart pkg/analyzer_experimental/lib/src/generated/utilities_dart.dart pkg/analyzer_experimental/lib/src/generated/instrumentation.dart pkg/analyzer_experimental/lib/src/generated/source_io.dart pkg/analyzer_experimental/lib/src/generated/ast.dart pkg/analyzer_experimental/lib/src/generated/sdk.dart pkg/analyzer_experimental/lib/src/generated/element.dart pkg/analyzer_experimental/lib/src/generated/engine.dart pkg/analyzer_experimental/lib/src/generated/scanner.dart pkg/analyzer_experimental/lib/src/generated/java_core.dart pkg/analyzer_experimental/lib/src/generated/java_engine.dart pkg/analyzer_experimental/lib/src/generated/java_io.dart pkg/analyzer_experimental/lib/src/generated/parser.dart pkg/analyzer_experimental/lib/src/generated/java_junit.dart pkg/analyzer_experimental/lib/src/generated/sdk_io.dart pkg/analyzer_experimental/lib/src/generated/html.dart pkg/analyzer_experimental/lib/src/generated/java_engine_io.dart pkg/analyzer_experimental/lib/src/generated/error.dart pkg/analyzer_experimental/lib/src/generated/source.dart pkg/analyzer_experimental/lib/src/generated/resolver.dart pkg/analyzer_experimental/test/utils.dart pkg/analyzer_experimental/test/error_test.dart pkg/analyzer_experimental/test/options_test.dart pkg/analyzer_experimental/test/generated/resolver_test.dart pkg/analyzer_experimental/test/generated/scanner_test.dart pkg/analyzer_experimental/test/generated/element_test.dart pkg/analyzer_experimental/test/generated/ast_test.dart pkg/analyzer_experimental/test/generated/test_support.dart pkg/analyzer_experimental/test/generated/parser_test.dart pkg/analyzer_experimental/example/scanner_driver.dart pkg/analyzer_experimental/example/resolver_driver.dart pkg/analyzer_experimental/example/parser_driver.dart pkg/webdriver/lib/webdriver.dart pkg/webdriver/lib/src/base64decoder.dart pkg/webdriver/test/webdriver_test.dart pkg/fixnum/lib/fixnum.dart pkg/fixnum/lib/src/int64.dart pkg/fixnum/lib/src/intx.dart pkg/fixnum/lib/src/int32.dart pkg/fixnum/test/int_32_test.dart pkg/fixnum/test/int_64_vm_test.dart pkg/fixnum/test/int_64_test.dart pkg/pathos/lib/path.dart pkg/pathos/test/pathos_test.dart pkg/pathos/test/pathos_windows_test.dart pkg/pathos/test/pathos_posix_test.dart pkg/crypto/lib/crypto.dart pkg/crypto/lib/src/crypto_utils.dart pkg/crypto/lib/src/hmac.dart pkg/crypto/lib/src/sha1.dart pkg/crypto/lib/src/hash_utils.dart pkg/crypto/lib/src/md5.dart pkg/crypto/lib/src/sha256.dart pkg/meta/lib/meta.dart pkg/oauth2/lib/oauth2.dart pkg/oauth2/lib/src/utils.dart pkg/oauth2/lib/src/expiration_exception.dart pkg/oauth2/lib/src/credentials.dart pkg/oauth2/lib/src/authorization_exception.dart pkg/oauth2/lib/src/authorization_code_grant.dart pkg/oauth2/lib/src/handle_access_token_response.dart pkg/oauth2/lib/src/client.dart pkg/oauth2/test/utils.dart pkg/oauth2/test/handle_access_token_response_test.dart pkg/oauth2/test/authorization_code_grant_test.dart pkg/oauth2/test/client_test.dart pkg/oauth2/test/utils_test.dart pkg/oauth2/test/credentials_test.dart pkg/http/lib/http.dart pkg/http/lib/testing.dart pkg/http/lib/src/io_client.dart pkg/http/lib/src/utils.dart pkg/http/lib/src/base_request.dart pkg/http/lib/src/streamed_response.dart pkg/http/lib/src/byte_stream.dart pkg/http/lib/src/base_client.dart pkg/http/lib/src/streamed_request.dart pkg/http/lib/src/base_response.dart pkg/http/lib/src/mock_client.dart pkg/http/lib/src/response.dart pkg/http/lib/src/request.dart pkg/http/lib/src/client.dart pkg/http/lib/src/multipart_file.dart pkg/http/lib/src/multipart_request.dart pkg/http/test/mock_client_test.dart pkg/http/test/utils.dart pkg/http/test/streamed_request_test.dart pkg/http/test/multipart_test.dart pkg/http/test/client_test.dart pkg/http/test/http_test.dart pkg/http/test/request_test.dart pkg/http/test/response_test.dart pkg/http/test/safe_http_server.dart pkg/expect/lib/expect.dart pkg/mdv_observe/lib/mdv_observe.dart pkg/mdv_observe/lib/src/observable_list.dart pkg/mdv_observe/lib/src/observable_map.dart pkg/mdv_observe/lib/src/observable_box.dart pkg/mdv_observe/test/utils.dart pkg/mdv_observe/test/list_change_test.dart pkg/mdv_observe/test/observable_list_test.dart pkg/mdv_observe/test/observe_test.dart pkg/mdv_observe/test/observable_map_test.dart pkg/logging/lib/logging.dart pkg/logging/test/logging_test.dart pkg/stack_trace/lib/stack_trace.dart pkg/stack_trace/lib/src/utils.dart pkg/stack_trace/lib/src/lazy_trace.dart pkg/stack_trace/lib/src/trace.dart pkg/stack_trace/lib/src/frame.dart pkg/stack_trace/test/frame_test.dart pkg/stack_trace/test/trace_test.dart pkg/yaml/lib/yaml.dart pkg/yaml/lib/src/composer.dart pkg/yaml/lib/src/utils.dart pkg/yaml/lib/src/yaml_exception.dart pkg/yaml/lib/src/deep_equals.dart pkg/yaml/lib/src/visitor.dart pkg/yaml/lib/src/yaml_map.dart pkg/yaml/lib/src/parser.dart pkg/yaml/lib/src/model.dart pkg/yaml/lib/src/constructor.dart pkg/yaml/test/yaml_test.dart pkg/scheduled_test/lib/scheduled_test.dart pkg/scheduled_test/lib/scheduled_process.dart pkg/scheduled_test/lib/scheduled_server.dart pkg/scheduled_test/lib/descriptor.dart pkg/scheduled_test/lib/src/utils.dart pkg/scheduled_test/lib/src/schedule_error.dart pkg/scheduled_test/lib/src/task.dart pkg/scheduled_test/lib/src/substitute_future.dart pkg/scheduled_test/lib/src/scheduled_future_matchers.dart pkg/scheduled_test/lib/src/value_future.dart pkg/scheduled_test/lib/src/mock_clock.dart pkg/scheduled_test/lib/src/future_group.dart pkg/scheduled_test/lib/src/schedule.dart pkg/scheduled_test/lib/src/scheduled_server/handler.dart pkg/scheduled_test/lib/src/scheduled_server/safe_http_server.dart pkg/scheduled_test/lib/src/descriptor/directory_descriptor.dart pkg/scheduled_test/lib/src/descriptor/async_descriptor.dart pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart pkg/scheduled_test/lib/src/descriptor/descriptor.dart pkg/scheduled_test/lib/src/descriptor/file_descriptor.dart pkg/scheduled_test/lib/src/descriptor/pattern_descriptor.dart pkg/scheduled_test/test/utils.dart pkg/scheduled_test/test/substitute_future_test.dart pkg/scheduled_test/test/scheduled_server_test.dart pkg/scheduled_test/test/scheduled_future_matchers_test.dart pkg/scheduled_test/test/metatest.dart pkg/scheduled_test/test/value_future_test.dart pkg/scheduled_test/test/scheduled_process_test.dart pkg/scheduled_test/test/descriptor/utils.dart pkg/scheduled_test/test/descriptor/file_test.dart pkg/scheduled_test/test/descriptor/nothing_test.dart pkg/scheduled_test/test/descriptor/pattern_test.dart pkg/scheduled_test/test/descriptor/directory_test.dart pkg/scheduled_test/test/descriptor/async_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_state_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_current_task_test.dart pkg/scheduled_test/test/scheduled_test/nested_task_test.dart pkg/scheduled_test/test/scheduled_test/on_exception_test.dart pkg/scheduled_test/test/scheduled_test/task_return_value_test.dart pkg/scheduled_test/test/scheduled_test/abort_test.dart pkg/scheduled_test/test/scheduled_test/timeout_test.dart pkg/scheduled_test/test/scheduled_test/out_of_band_task_test.dart pkg/scheduled_test/test/scheduled_test/wrap_async_test.dart pkg/scheduled_test/test/scheduled_test/wrap_future_test.dart pkg/scheduled_test/test/scheduled_test/signal_error_test.dart pkg/scheduled_test/test/scheduled_test/set_up_test.dart pkg/scheduled_test/test/scheduled_test/on_complete_test.dart pkg/scheduled_test/test/scheduled_test/simple_test.dart pkg/scheduled_test/test/scheduled_test/current_schedule_errors_test.dart pkg/unittest/lib/unittest.dart pkg/unittest/lib/html_individual_config.dart pkg/unittest/lib/vm_config.dart pkg/unittest/lib/html_enhanced_config.dart pkg/unittest/lib/matcher.dart pkg/unittest/lib/interactive_html_config.dart pkg/unittest/lib/mock.dart pkg/unittest/lib/html_config.dart pkg/unittest/lib/compact_vm_config.dart pkg/unittest/lib/src/expect.dart pkg/unittest/lib/src/basematcher.dart pkg/unittest/lib/src/utils.dart pkg/unittest/lib/src/string_matchers.dart pkg/unittest/lib/src/pretty_print.dart pkg/unittest/lib/src/core_matchers.dart pkg/unittest/lib/src/interfaces.dart pkg/unittest/lib/src/description.dart pkg/unittest/lib/src/future_matchers.dart pkg/unittest/lib/src/numeric_matchers.dart pkg/unittest/lib/src/iterable_matchers.dart pkg/unittest/lib/src/map_matchers.dart pkg/unittest/lib/src/config.dart pkg/unittest/lib/src/test_case.dart pkg/unittest/lib/src/operator_matchers.dart pkg/unittest/test/mock_regexp_negative_test.dart pkg/unittest/test/matchers_minified_test.dart pkg/unittest/test/matchers_test.dart pkg/unittest/test/unittest_test.dart pkg/unittest/test/matchers_unminified_test.dart pkg/unittest/test/test_common.dart pkg/unittest/test/test_utils.dart pkg/unittest/test/pretty_print_test.dart pkg/unittest/test/pretty_print_minified_test.dart pkg/unittest/test/instance_test.dart pkg/unittest/test/pretty_print_unminified_test.dart pkg/unittest/test/mock_test.dart pkg/unittest/test/mock_stepwise_negative_test.dart pkg/args/lib/args.dart pkg/args/lib/src/parser.dart pkg/args/lib/src/usage.dart pkg/args/test/args_test.dart pkg/args/test/usage_test.dart pkg/args/test/command_test.dart pkg/args/test/parse_test.dart pkg/args/example/test_runner.dart pkg/source_maps/lib/span.dart pkg/source_maps/lib/source_maps.dart pkg/source_maps/lib/parser.dart pkg/source_maps/lib/builder.dart pkg/source_maps/lib/printer.dart pkg/source_maps/lib/src/utils.dart pkg/source_maps/lib/src/vlq.dart pkg/source_maps/test/vlq_test.dart pkg/source_maps/test/run.dart pkg/source_maps/test/builder_test.dart pkg/source_maps/test/utils_test.dart pkg/source_maps/test/common.dart pkg/source_maps/test/parser_test.dart pkg/source_maps/test/printer_test.dart pkg/source_maps/test/span_test.dart pkg/source_maps/test/end2end_test.dart FORCE_DO_CMD
+	$(call do_cmd,dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot)
+
+all_deps += $(obj)/gen/pub.dart.snapshot
+action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs := $(obj)/gen/pub.dart.snapshot
+
+
+### Rules for final target.
+# Build our special outputs first.
+$(obj).target/utils/pub/pub.stamp: | $(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs)
+
+# Preserve order dependency of special output on deps.
+$(action_dart_utils_pub_pub_gyp_pub_target_generate_pub_snapshot_outputs): | $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp
+
+$(obj).target/utils/pub/pub.stamp: TOOLSET := $(TOOLSET)
+$(obj).target/utils/pub/pub.stamp: $(builddir)/dart $(obj).target/pkg/pkg_packages.stamp FORCE_DO_CMD
+	$(call do_cmd,touch)
+
+all_deps += $(obj).target/utils/pub/pub.stamp
+# Add target alias
+.PHONY: pub
+pub: $(obj).target/utils/pub/pub.stamp
+
+# Add target alias to "all" target.
+.PHONY: all
+all: pub
+
diff --git a/utils/pub/solver/greedy_solver.dart b/utils/pub/solver/greedy_solver.dart
new file mode 100644
index 0000000..e664ea2
--- /dev/null
+++ b/utils/pub/solver/greedy_solver.dart
@@ -0,0 +1,556 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Attempts to resolve a set of version constraints for a package dependency
+/// graph and select an appropriate set of best specific versions for all
+/// dependent packages. It works iteratively and tries to reach a stable
+/// solution where the constraints of all dependencies are met. If it fails to
+/// reach a solution after a certain number of iterations, it assumes the
+/// dependency graph is unstable and reports and error.
+///
+/// There are two fundamental operations in the process of iterating over the
+/// graph:
+///
+/// 1.  Changing the selected concrete version of some package. (This includes
+///     adding and removing a package too, which is considering changing the
+///     version to or from "none".) In other words, a node has changed.
+/// 2.  Changing the version constraint that one package places on another. In
+///     other words, and edge has changed.
+///
+/// Both of these events have a corresponding (potentional) async operation and
+/// roughly cycle back and forth between each other. When we change the version
+/// of package changes, we asynchronously load the pubspec for the new version.
+/// When that's done, we compare the dependencies of the new version versus the
+/// old one. For everything that differs, we change those constraints between
+/// this package and that dependency.
+///
+/// When a constraint on a package changes, we re-calculate the overall
+/// constraint on that package. I.e. with a shared dependency, we intersect all
+/// of the constraints that its depending packages place on it. If that overall
+/// constraint changes (say from "<3.0.0" to "<2.5.0"), then the currently
+/// picked version for that package may fall outside of the new constraint. If
+/// that happens, we find the new best version that meets the updated constraint
+/// and then the change the package to use that version. That cycles back up to
+/// the beginning again.
+library version_solver1;
+
+import 'dart:async';
+import 'dart:collection' show Queue;
+import 'dart:math' as math;
+
+import '../lock_file.dart';
+import '../log.dart' as log;
+import '../package.dart';
+import '../source.dart';
+import '../source_registry.dart';
+import '../version.dart';
+import 'version_solver.dart';
+
+class GreedyVersionSolver extends VersionSolver {
+  final _packages = <String, DependencyNode>{};
+  final _work = new Queue<WorkItem>();
+  int _numIterations = 0;
+
+  GreedyVersionSolver(SourceRegistry sources, Package root, LockFile lockFile,
+                      List<String> useLatest)
+      : super(sources, root, lockFile, useLatest);
+
+  /// The non-backtracking solver always only tries one solution.
+  int get attemptedSolutions => 1;
+
+  void forceLatestVersion(String package) {
+    // TODO(nweiz): How do we want to detect and handle unknown dependencies
+    // here?
+    getDependency(package).useLatestVersion = true;
+  }
+
+  Future<List<PackageId>> runSolver() {
+    // Kick off the work by adding the root package at its concrete version to
+    // the dependency graph.
+    enqueue(new AddConstraint('(entrypoint)', new PackageRef.root(root)));
+
+    Future processNextWorkItem(_) {
+      while (true) {
+        // Stop if we are done.
+        if (_work.isEmpty) return new Future.value(buildResults());
+
+        // If we appear to be stuck in a loop, then we probably have an unstable
+        // graph, bail. We guess this based on a rough heuristic that it should
+        // only take a certain number of steps to solve a graph with a given
+        // number of connections.
+        // TODO(rnystrom): These numbers here are magic and arbitrary. Tune
+        // when we have a better picture of real-world package topologies.
+        _numIterations++;
+        if (_numIterations > math.max(50, _packages.length * 5)) {
+          throw new CouldNotSolveException();
+        }
+
+        // Run the first work item.
+        var future = _work.removeFirst().process(this);
+
+        // If we have an async operation to perform, chain the loop to resume
+        // when it's done. Otherwise, just loop synchronously.
+        if (future != null) {
+          return future.then(processNextWorkItem);
+        }
+      }
+    }
+
+    return processNextWorkItem(null);
+  }
+
+  void enqueue(WorkItem work) {
+    _work.add(work);
+  }
+
+  DependencyNode getDependency(String package) {
+    // There can be unused dependencies in the graph, so just create an empty
+    // one if needed.
+    _packages.putIfAbsent(package, () => new DependencyNode(package));
+    return _packages[package];
+  }
+
+  /// Sets the best selected version of [package] to [version].
+  void setVersion(String package, Version version) {
+    _packages[package].version = version;
+  }
+
+  /// Returns the most recent version of [dependency] that satisfies all of its
+  /// version constraints.
+  Future<Version> getBestVersion(DependencyNode dependency) {
+    return cache.getVersions(dependency.name,
+        dependency.source, dependency.description).then((versions) {
+      var best = null;
+      for (var ref in versions) {
+        if (dependency.useLatestVersion ||
+            dependency.constraint.allows(ref.version)) {
+          if (best == null || ref.version > best) best = ref.version;
+        }
+      }
+
+      // TODO(rnystrom): Better exception.
+      if (best == null) {
+        if (tryUnlockDepender(dependency)) return null;
+        throw new NoVersionException(dependency.name, dependency.constraint,
+            dependency.toList());
+      } else if (!dependency.constraint.allows(best)) {
+        if (tryUnlockDepender(dependency)) return null;
+        throw new CouldNotUpdateException(
+            dependency.name, dependency.constraint, best);
+      }
+
+      return best;
+    });
+  }
+
+  /// Looks for a package that depends (transitively) on [dependency] and has
+  /// its version locked in the lockfile. If one is found, enqueues an
+  /// [UnlockPackage] work item for it and returns true. Otherwise, returns
+  /// false.
+  ///
+  /// This does a breadth-first search; immediate dependers will be unlocked
+  /// first, followed by transitive dependers.
+  bool tryUnlockDepender(DependencyNode dependency, [Set<String> seen]) {
+    if (seen == null) seen = new Set();
+    // Avoid an infinite loop if there are circular dependencies.
+    if (seen.contains(dependency.name)) return false;
+    seen.add(dependency.name);
+
+    for (var dependerName in dependency.dependers) {
+      var depender = getDependency(dependerName);
+      var locked = lockFile.packages[dependerName];
+      if (locked != null && depender.version == locked.version &&
+          depender.source.name == locked.source.name) {
+        enqueue(new UnlockPackage(depender));
+        return true;
+      }
+    }
+
+    return dependency.dependers.map(getDependency).any((subdependency) =>
+        tryUnlockDepender(subdependency, seen));
+  }
+
+  List<PackageId> buildResults() {
+    return _packages.values
+        .where((dep) => dep.isDependedOn)
+        .map(_dependencyToPackageId)
+        .toList();
+  }
+
+  PackageId _dependencyToPackageId(DependencyNode dep) {
+    var description = dep.description;
+
+    // If the lockfile contains a fully-resolved description for the package,
+    // use that. This allows e.g. Git to ensure that the same commit is used.
+    var lockedPackage = lockFile.packages[dep.name];
+    if (lockedPackage != null && lockedPackage.version == dep.version &&
+        lockedPackage.source.name == dep.source.name &&
+        dep.source.descriptionsEqual(
+            description, lockedPackage.description)) {
+      description = lockedPackage.description;
+    }
+
+    return new PackageId(dep.name, dep.source, dep.version, description);
+  }
+}
+
+/// The constraint solver works by iteratively processing a queue of work items.
+/// Each item is a single atomic change to the dependency graph. Handling them
+/// in a queue lets us handle asynchrony (resolving versions requires
+/// information from servers) as well as avoid deeply nested recursion.
+abstract class WorkItem {
+  /// Processes this work item. Returns a future that completes when the work is
+  /// done. If `null` is returned, that means the work has completed
+  /// synchronously and the next item can be started immediately.
+  Future process(GreedyVersionSolver solver);
+}
+
+/// The best selected version for a package has changed to [version]. If the
+/// previous version of the package is `null`, that means the package is being
+/// added to the graph. If [version] is `null`, it is being removed.
+class ChangeVersion implements WorkItem {
+  /// The name of the package whose version is being changed.
+  final String package;
+
+  /// The source of the package whose version is changing.
+  final Source source;
+
+  /// The description identifying the package whose version is changing.
+  final description;
+
+  /// The new selected version.
+  final Version version;
+
+  ChangeVersion(this.package, this.source, this.description, this.version);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Changing $package to version $version.");
+
+    var dependency = solver.getDependency(package);
+    var oldVersion = dependency.version;
+    solver.setVersion(package, version);
+
+    // The dependencies between the old and new version may be different. Walk
+    // them both and update any constraints that differ between the two.
+    return Future.wait([
+        getDependencyRefs(solver, oldVersion),
+        getDependencyRefs(solver, version)]).then((list) {
+      var oldDependencyRefs = list[0];
+      var newDependencyRefs = list[1];
+
+      for (var oldRef in oldDependencyRefs.values) {
+        if (newDependencyRefs.containsKey(oldRef.name)) {
+          // The dependency is in both versions of this package, but its
+          // constraint may have changed.
+          var newRef = newDependencyRefs.remove(oldRef.name);
+          solver.enqueue(new AddConstraint(package, newRef));
+        } else {
+          // The dependency is not in the new version of the package, so just
+          // remove its constraint.
+          solver.enqueue(new RemoveConstraint(package, oldRef.name));
+        }
+      }
+
+      // Everything that's left is a depdendency that's only in the new
+      // version of the package.
+      for (var newRef in newDependencyRefs.values) {
+        solver.enqueue(new AddConstraint(package, newRef));
+      }
+    });
+  }
+
+  /// Get the dependencies at [version] of the package being changed.
+  Future<Map<String, PackageRef>> getDependencyRefs(VersionSolver solver,
+      Version version) {
+    // If there is no version, it means no package, so no dependencies.
+    if (version == null) {
+      return new Future<Map<String, PackageRef>>.value(<String, PackageRef>{});
+    }
+
+    var id = new PackageId(package, source, version, description);
+    return solver.cache.getPubspec(id).then((pubspec) {
+      var dependencies = <String, PackageRef>{};
+      for (var dependency in pubspec.dependencies) {
+        dependencies[dependency.name] = dependency;
+      }
+
+      // Include dev dependencies only from the root package.
+      if (id.isRoot) {
+        for (var dependency in pubspec.devDependencies) {
+          dependencies[dependency.name] = dependency;
+        }
+      }
+
+      return dependencies;
+    });
+  }
+}
+
+/// A constraint that a depending package places on a dependent package has
+/// changed.
+///
+/// This is an abstract class that contains logic for updating the dependency
+/// graph once a dependency has changed. Changing the dependency is the
+/// responsibility of subclasses.
+abstract class ChangeConstraint implements WorkItem {
+  Future process(GreedyVersionSolver solver);
+
+  void undo(GreedyVersionSolver solver);
+
+  Future _processChange(GreedyVersionSolver solver,
+                        DependencyNode oldDependency,
+                        DependencyNode newDependency) {
+    var name = newDependency.name;
+    var source = oldDependency.source != null ?
+      oldDependency.source : newDependency.source;
+    var description = oldDependency.description != null ?
+      oldDependency.description : newDependency.description;
+    var oldConstraint = oldDependency.constraint;
+    var newConstraint = newDependency.constraint;
+
+    // If the package is over-constrained, i.e. the packages depending have
+    // disjoint constraints, then try unlocking a depender that's locked by the
+    // lockfile. If there are no remaining locked dependencies, throw an error.
+    if (newConstraint != null && newConstraint.isEmpty) {
+      if (solver.tryUnlockDepender(newDependency)) {
+        undo(solver);
+        return null;
+      }
+
+      throw new DisjointConstraintException(name, newDependency.toList());
+    }
+
+    // If this constraint change didn't cause the overall constraint on the
+    // package to change, then we don't need to do any further work.
+    if (oldConstraint == newConstraint) return null;
+
+    // If the dependency has been cut free from the graph, just remove it.
+    if (!newDependency.isDependedOn) {
+      solver.enqueue(new ChangeVersion(name, source, description, null));
+      return null;
+    }
+
+    // If the dependency is on the root package, then we don't need to do
+    // anything since it's already at the best version.
+    if (name == solver.root.name) {
+      solver.enqueue(new ChangeVersion(
+          name, source, description, solver.root.version));
+      return null;
+    }
+
+    // If the dependency is on a package in the lockfile, use the lockfile's
+    // version for that package if it's valid given the other constraints.
+    var lockedPackage = solver.lockFile.packages[name];
+    if (lockedPackage != null && newDependency.source == lockedPackage.source) {
+      var lockedVersion = lockedPackage.version;
+      if (newConstraint.allows(lockedVersion)) {
+        solver.enqueue(
+            new ChangeVersion(name, source, description, lockedVersion));
+        return null;
+      }
+    }
+
+    // The constraint has changed, so see what the best version of the package
+    // that meets the new constraint is.
+    return solver.getBestVersion(newDependency).then((best) {
+      if (best == null) {
+        undo(solver);
+      } else if (newDependency.version != best) {
+        solver.enqueue(new ChangeVersion(name, source, description, best));
+      }
+    });
+  }
+}
+
+/// The constraint given by [ref] is being placed by [depender].
+class AddConstraint extends ChangeConstraint {
+  /// The package that has the dependency.
+  final String depender;
+
+  /// The package being depended on and the constraints being placed on it. The
+  /// source, version, and description in this ref are all considered
+  /// constraints on the dependent package.
+  final PackageRef ref;
+
+  AddConstraint(this.depender, this.ref);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Adding $depender's constraint $ref.");
+
+    var dependency = solver.getDependency(ref.name);
+    var oldDependency = dependency.clone();
+    dependency.placeConstraint(depender, ref);
+    return _processChange(solver, oldDependency, dependency);
+  }
+
+  void undo(GreedyVersionSolver solver) {
+    solver.getDependency(ref.name).removeConstraint(depender);
+  }
+}
+
+/// [depender] is no longer placing a constraint on [dependent].
+class RemoveConstraint extends ChangeConstraint {
+  /// The package that was placing a constraint on [dependent].
+  String depender;
+
+  /// The package that was being depended on.
+  String dependent;
+
+  /// The constraint that was removed.
+  PackageRef _removed;
+
+  RemoveConstraint(this.depender, this.dependent);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Removing $depender's constraint ($_removed) on $dependent.");
+
+    var dependency = solver.getDependency(dependent);
+    var oldDependency = dependency.clone();
+    _removed = dependency.removeConstraint(depender);
+    return _processChange(solver, oldDependency, dependency);
+  }
+
+  void undo(GreedyVersionSolver solver) {
+    solver.getDependency(dependent).placeConstraint(depender, _removed);
+  }
+}
+
+/// [package]'s version is no longer constrained by the lockfile.
+class UnlockPackage implements WorkItem {
+  /// The package being unlocked.
+  DependencyNode package;
+
+  UnlockPackage(this.package);
+
+  Future process(GreedyVersionSolver solver) {
+    log.fine("Unlocking ${package.name}.");
+
+    solver.lockFile.packages.remove(package.name);
+    return solver.getBestVersion(package).then((best) {
+      if (best == null) return null;
+      solver.enqueue(new ChangeVersion(
+          package.name, package.source, package.description, best));
+    });
+  }
+}
+
+/// Describes one [Package] in the [DependencyGraph] and keeps track of which
+/// packages depend on it and what constraints they place on it.
+class DependencyNode {
+  /// The name of the this dependency's package.
+  final String name;
+
+  /// The [PackageRefs] that represent constraints that depending packages have
+  /// placed on this one.
+  final Map<String, PackageRef> _refs;
+
+  /// The currently-selected best version for this dependency.
+  Version version;
+
+  /// Whether this dependency should always select the latest version.
+  bool useLatestVersion = false;
+
+  /// Gets whether or not any other packages are currently depending on this
+  /// one. If `false`, then it means this package is not part of the dependency
+  /// graph and should be omitted.
+  bool get isDependedOn => !_refs.isEmpty;
+
+  /// The names of all the packages that depend on this dependency.
+  Iterable<String> get dependers => _refs.keys;
+
+  /// Gets the overall constraint that all packages are placing on this one.
+  /// If no packages have a constraint on this one (which can happen when this
+  /// package is in the process of being added to the graph), returns `null`.
+  VersionConstraint get constraint {
+    if (_refs.isEmpty) return null;
+    return new VersionConstraint.intersection(
+        _refs.values.map((ref) => ref.constraint));
+  }
+
+  /// The source of this dependency's package.
+  Source get source {
+     var canonical = _canonicalRef();
+     if (canonical == null) return null;
+     return canonical.source;
+  }
+
+  /// The description of this dependency's package.
+  get description {
+     var canonical = _canonicalRef();
+     if (canonical == null) return null;
+     return canonical.description;
+  }
+
+  /// Return the PackageRef that has the canonical source and description for
+  /// this package. If any dependency is on the root package, that will be used;
+  /// otherwise, it will be the source and description that all dependencies
+  /// agree upon.
+  PackageRef _canonicalRef() {
+    if (_refs.isEmpty) return null;
+    var refs = _refs.values;
+    for (var ref in refs) {
+      if (ref.isRoot) return ref;
+    }
+    return refs.first;
+  }
+
+  DependencyNode(this.name)
+      : _refs = <String, PackageRef>{};
+
+  DependencyNode._clone(DependencyNode other)
+      : name = other.name,
+        version = other.version,
+        _refs = new Map<String, PackageRef>.from(other._refs);
+
+  /// Creates a copy of this dependency.
+  DependencyNode clone() => new DependencyNode._clone(this);
+
+  /// Places [ref] as a constraint from [package] onto this.
+  void placeConstraint(String package, PackageRef ref) {
+    var requiredDepender = _requiredDepender();
+    if (requiredDepender != null) {
+      var required = _refs[requiredDepender];
+      if (required.source.name != ref.source.name) {
+        throw new SourceMismatchException(name, [
+            new Dependency(requiredDepender, required),
+            new Dependency(package, ref)]);
+      } else if (!required.descriptionEquals(ref)) {
+        throw new DescriptionMismatchException(name, [
+            new Dependency(requiredDepender, required),
+            new Dependency(package, ref)]);
+      }
+    }
+
+    _refs[package] = ref;
+  }
+
+  /// Returns the name of a package whose constraint source and description
+  /// all other constraints must match. Returns null if there are no
+  /// requirements on new constraints.
+  String _requiredDepender() {
+    if (_refs.isEmpty) return null;
+
+    var dependers = _refs.keys.toList();
+    if (dependers.length == 1) {
+      var depender = dependers[0];
+      if (_refs[depender].isRoot) return null;
+      return depender;
+    }
+
+    return dependers[1];
+  }
+
+  /// Removes the constraint from [package] onto this.
+  PackageRef removeConstraint(String package) => _refs.remove(package);
+
+  /// Converts this to a list of [Dependency] objects like the error types
+  /// expect.
+  List<Dependency> toList() {
+    var result = <Dependency>[];
+    _refs.forEach((name, ref) {
+      result.add(new Dependency(name, ref));
+    });
+    return result;
+  }
+}